미래 사회는 어떻게 바뀔까?

이 책은 과학기술이 발달함에 따라 정치적, 경제적, 사회적으로 어떻게 세상이 변할 것인가에 대해 서술한 책으로, 세계 석학이라 불리는 8인의 사람들의 인터뷰 형식으로 구성되어 있다.

가장 흥미로웠던 부분은 과학기술의 발전으로 민주주의의 기능이 올바른 역할을 하지 못하고 있다는 것을 지적한 것이었다. 20세기 가장 성공한 정치구조였지만 최근 정보가 기하급수적으로 늘면서 세계에서 일어나는 수 많은 일을 파악하기 어렵다는 것이다. 파악하고 예측할 수 없으니 미래에 추구할 목표나 가치를 결정할 수도, 계획을 세울 수도 없다 말한다. 때문에 새로운 정치구조가 도입될 가능성을 제시했고, 과연 미래에는 어떤 정치 구조가 도입될 수 있을까 생각해볼 수 있었다.

이 책을 관통해서 말하는 기술은 인공지능이다. 세계 석학은 인공지능의 발달로 무용(無用)계급이 도래할 것이라 말한다. 범용 인공지능이 대두 되면서 사람들의 일자리를 뺏을 수 있다는 것이다. 이에 대한 대안으로 최근 계속 다뤄지고 있는 기본 소득에 대한 도입 배경을 알 수 있었다. 하지만 흥미로웠던 것은 기본 소득의 여러 문제점 중 삶의 의미에 관한 문제였다. 단순히 의식주를 제공한다면 모든 것이 해결 될 것인가? 인간 삶의 의미가 어떻게 변할지 생각해볼 수 있는 대목이었다.

세계 석학은 끊임 없이 익히고 급변하는 상황에 대응할 수 있어야 된다고 말한다. 그 이유는 인간수명의 장기화와 과학기술로 인한 세계 변화의 가속화 때문이라 말한다. 인생에는 배우는 시기와 배운 것을 활용하는 두 시기가 있지만 21세기는 통하지 않는 다는 것이다. 끊임없이 학습하고 혁신해야 한다고 말한다.

이 책에 대한 총평은, 세상이 직면한 문제와 어떻게 바뀔 것인가에 대한 거시적 관점으로 바라볼 수 있었다는 것이 가장 좋았던 장점이고 단점으로는 내용의 깊이가 깊지 않았다는 것이다. 세상의 변화에 대해 가벼운 마음으로 보고자 한다면 이 책을 추천한다.

별점: ⭐️⭐️

수명이 늘어나면 재산을 모으기보다, 지금보다 오래 일하기 위한 자산을 축적해두어야 한다. - 책 속에서

이 포스팅은 『밑바닥부터 시작하는 딥러닝』을 기반으로 작성되었습니다. 간단한 이론이지만 누군가에게 설명할 수 있는가에 대해 생각한 결과, 올바르게 설명하지 못한다고 판단되어 이를 쇄신하고자 하는 마음으로 작성합니다. 

 

신경망 학습과 손실함수

신경망을 학습한다는 것은 훈련 데이터로부터 매개변수(가중치, 편향)의 최적값을 찾아가는 것을 의미한다. 이 때 매개변수가 얼마나 잘 학습되었는지를 어떻게 판단할 수 있을까? 방법은 손실함수(loss function)을 사용하는 것이다. 손실함수란 훈련 데이터로부터 학습된 매개변수를 사용하여 도출된 출력 신호와 실제 정답이 얼마나 오차가 있는지를 판단하는 함수이다. 다시 말해 학습된 신경망으로부터 도출된 결과 값과 실제 정답이 얼마나 차이가 나는지를 계산하는 함수이다. 값의 차이를 손실이라고 말하며 신경망은 이 손실함수의 값이 작아지는 방향으로 매개변수를 업데이트 하게 된다.

 

그렇다면 신경망의 학습을 위해 사용하는 손실함수의 종류들은 무엇이 있을까? 종류를 논하기에 앞서 손실함수는 풀고자하는 태스크에 따라 달라질 수 있다. 예를 들어 머신러닝 태스크는 크게 분류 태스크와 회귀 태스크가 있을 것이다. 분류 태스크라고 한다면 이 사진이 강아지, 고양이, 원숭이 중 어디에 해당할지 분류 하는 것이다. 분류 태스크의 특징은 실수와 같이 연속적인 것이 아니라 정수와 같이 불연속적으로 정확하게 강아지, 고양이, 원숭이 중 하나로 나눌 수 있다. 반면 회귀 태스크는 연속이 아닌 불연속적(이산적)인 값을 가지는 태스크를 수행하는 것을 의미한다. 예를 들어 사람의 키에 따르는 몸무게 분포를 구하는 태스크일 경우 몸무게와 같은 데이터는 실수로 표현할 수 있기 때문에 출력 값이 연속적인 특징을 가지는 회귀 태스크라 할 수 있다.

 

그렇다면 손실함수의 종류와 특징들에 대해서 알아보도록 하자.

 

손실함수 (Loss Function)

평균제곱오차 (Mean Squared Error, MSE)

여러 종류의 손실함수 중 평균제곱오차라는 손실함수가 있다. 이 손실함수를 수식으로 나타내면 다음과 같다.

 

$$ MSE = {1\over n}\sum_i^n(\hat{y}_i - y_i)^2 $$

 

간단한 수식이다. 천천히 살펴보자면, $\hat{y}_i$는 신경망의 출력 신호이며 $y_i$는 실제 정답이다. $n$은 학습 데이터 수를 의미한다. 이를 해석하자면 출력(예측) 신호와 실제 정답 간의 차이를 구한다음 제곱을 해준 값을 데이터셋 수 만큼 반복하며 더해주는 것이다. 제곱을 해주는 이유는 음수가 나오는 경우를 대비하여 마이너스 부호를 없애기 위함이다. $1\over n$를 곱해주는 이유는 평균 값을 구해주기 위함이다. 즉 MSE를 한마디로 이야기하면 오차의 제곱을 평균으로 나눈다고 할 수 있다. 따라서 MSE는 값이 작으면 작을 수록 예측과 정답 사이의 손실이 적다는 것이므로 좋다.

 

import numpy as np

def mean_squared_error(output, real):
    mse_loss = 1 / len(output) * np.sum((output - real) ** 2)
    return mse_loss

output = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] # 후보별 정답일 확률
real = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # 정답 = 2

mse_loss = mean_squared_error(np.array(output), np.array(real)) # input type = numpy array
print (mse_loss) # 0.0195
--------------------
output = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # 후보별 정답일 확률
mse_loss = mean_squared_error(np.array(output), np.array(real))
print (mse_loss) # 0.1195

 

출력 신호인, 예측 확률 output이 가지고 있는 가장 높은 확률 값과 정답이 차이가 적을수록 손실 함수의 출력 값도 적은 것을 확인할 수 있다. 반면 가장 높은 확률이 정답이 아닌 다른 곳을 가리킬 때 손실함수의 출력 값이 커지는 것을 확인할 수 있다. 위에서 볼 수 있듯 평균제곱오차(MSE)는 분류 태스크에 사용 된다.

 

교차 엔트로피 오차 (Cross-Entropy Error, CEE)

위와 달리 회귀 태스크에 사용하는 손실함수로 교차 엔트로피 오차가 있다. 수식으로 나타내면 다음과 같다.

 

$$ CEE = -\sum_i\hat{y_i}\ log_e^{y_i} $$

 

$\hat{y_i}$는 신경망의 출력이며 $y_i$는 실제 정답이다. 특히 $\hat{y_i}$는 one-hot encoding으로 정답에 해당하는 인덱스 원소만 1이며 이외에는 0이다. 따라서 실질적으로는 정답이라 추정될 때($\hat{y_i}=1$)의 자연로그를 계산하는 식이 된다. 즉 다시 말해 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 된다.

 

import numpy as np

def cross_entropy_error(output, real):
	delta = 1e-7
	cee_loss = -np.sum(output * np.log(real + delta))
	return cee_loss

output = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # 예측 정답 = 2번째
real = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.10] # 2번째가 정답일 확률 = 0.6
print (cross_entropy_error(np.array(output), np.array(real))) # 0.510825457099338

real = [0.1 , 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # 7번째가 정답일 확률 = 0.6
print (cross_entropy_error(np.array(output), np.array(real))) # 2.302584092994546

 

실제로 구현할 때는 log가 무한대가 되어 계산 불능이 되지 않도록 하기 위해 delta 값을 더해주는 방식으로 구현한다. 예측 정답이 2번이고 실제 정답이 2번일 경우의 손실함수 값은 0.051이고 이와 달리 예측 정답이 2번이고 실제 정답이 7번일 경우 손실함수 값은 2.302가 된다. 즉, 정답에 가까울수록 손실함수는 줄어들고 오답에 가까울수록 손실함수는 커진다고 볼 수 있다. 신경망의 목표는 이러한 손실함수의 값을 줄이는 방향으로 학습하는 것이다.

 

 

import sys
input = sys.stdin.readline

fibo_nums = [0, 1]
for i in range(45):
    fibo_nums.append(sum([fibo_nums[-1], fibo_nums[-2]]))
    
n = int(input())
print (fibo_nums[n])
#include <iostream>

using namespace std;

int main(void)
{
	int N = 0;
	
	cin >> N;
	
	if (N>=1 and N<=100000)	
	{
		for (int i=N; i>0; i--)
		{
			cout << i << '\n';
		}
	}
	
	return 0;
}
#include <iostream>

using namespace std;

int main(void)
{
	int N = 0;
	
	cin >> N;
	
	if (N>=1 and N<=100000)
	{
		for (int i=1; i<=N; i++)
		{
			cout << i << '\n';
		}
	}
}
#include <stdio.h>

int main(void)
{
	int N = 0;
	
	scanf("%d", &N);
	
	if (N >= 1 and N <= 9)
	{
		for (int i=1; i<=9; i++)
		{
			printf("%d * %d = %d\n", N, i, N*i);
		}
	}
	
	else
		return 0;
		
	return 0;
}
import sys
T = int(input())
for _ in range(T):
    count, string = sys.stdin.readline().split()
    P = ""
    for s in range(len(string)):
        P += string[s] * int(count)
        if s == len(string) -1:
            print (P)

'Computer Science > 백준 알고리즘' 카테고리의 다른 글

[백준] 2741번 N 찍기 (C++)  (0) 2022.03.16
[백준] 2739번 구구단 (C)  (0) 2022.03.16
[백준] 2588번 곱셈 (C++)  (0) 2022.03.16
[백준] 2581번 소수 (C++)  (0) 2022.03.16
[백준] 2577번 숫자의 개수 (C++)  (0) 2022.03.16

 

#include <iostream>
// 몫과 나머지 계산 + 자연수 길이 구하기 
using namespace std;

int getIntLen(int value)
{
	int count = 0;

	do
	{
		value = int(value/10);
		count++;
	}while(value > 0);
	
	return count;
}


int main(void)
{
	// 세자리 자연수 
	int N1, N2 = 0;
	
	// 자연수 길이
	int L1, L2 = 0; 
	
	// 중간 계산 
	int N3, N4, N5 = 0;
		
	cin >> N1;
	cin >> N2;
	
	L1 = getIntLen(N1);
	L2 = getIntLen(N2);
	
	if (L1 == 3 and L2 == 3)
	{
		N3 = N1 * (N2 % 10);
		N4 = N1 * ((N2 / 10) % 10);
		N5 = N1 * ((N2 / 100));
		
		cout << N3 << endl;
		cout << N4 << endl;
		cout << N5 << endl;
		
		cout << N1 * N2 << endl;
	}
	
	return 0;
}
#include <iostream>

using namespace std;

int main(void)
{
	int M = 0;
	int N = 0;
	
	int Count = 0;
	int Min = 0;
	int Sum = 0;
	int flag = true;

	cin >> M;
	cin >> N;
	
	if (M<=10000 and M>=1 and N<=10000 and N>=1) // initial condition
	{	
		for (int i=M; i<=N; i++) // M이상 N이하 자연수  
		{
			for (int j=1; j<=i; j++) // M까지의 수 
			{
				if (i % j == 0) // 소수 확인을 위해 M을 j로 나누어 Count를 계산 
				{
					Count = Count + 1;		 
				}
			}
			
			if (Count == 2) // 나누어지는게 1과 자기 자신 밖에 없는 소수라면 
			{
				Sum = Sum + i;
				
				if (flag)
				{
					Min = i;
					flag = false;	
				}
			}
			Count = 0;
		}
		
		if (Sum == 0)
		{
			cout << -1 << endl;
			return 0;
		}
		
		cout << Sum << endl;
		cout << Min << endl;
	}
	
	return 0;
}
#include <iostream>

#define NUM 10
using namespace std;

//int getDigitCount(int Value)
//{
//	int count = 0;
//	
//	
//	while (true)
//	{
//		Value = Value / 10;
//		count = count + 1;
//		
//		if (Value == 0)
//		{
//			break;
//		}
//	}
//	
//	return count;
//}

int main(void)
{
	int A, B, C = 0;
	int sum = 0;
	int count = 0;
	
	cin >> A >> B >> C;
	
	if (A>=100 and A<1000 and B>=100 and B<1000 and C>=100 and C<1000) 
	{
		sum = A * B * C;
//		count = getDigitCount(sum);
		int Array[NUM] = {0,};
		
		while (sum!=0)
		{
			Array[sum % 10] = Array[sum % 10] + 1;
			sum = sum / 10;
		}
		
		
		for (int j=0; j<NUM; j++) // Loop for printing the count of each digit.
		{
			cout << Array[j] << endl;
		}
		
	}
	
	return 0;
}

'Computer Science > 백준 알고리즘' 카테고리의 다른 글

[백준] 2588번 곱셈 (C++)  (0) 2022.03.16
[백준] 2581번 소수 (C++)  (0) 2022.03.16
[백준] 2562번 최대값 (C++)  (0) 2022.03.16
[백준] 2558번 A+B - 2 (C++)  (0) 2022.03.16
[백준] 2557번 Hello World (C++)  (0) 2022.03.16

+ Recent posts