신촌우왕 소개

서강대학교 물리학과 87학번 박찬우

(부전공: 수학)


수학자, 작곡가, 요가수행자, SCJP, MCSE




신촌우왕 예측: 47


다음은 수갤 게시판에서 제기된 문제이다.

(https://gall.dcinside.com/board/view/?id=mathematics&no=360799)


2☆5 = 27

4☆5 = 39

5☆4 = 35

7☆4 = ?


나는 이에 대하여

다음과 같이

한 가지 규칙을 제시했었다.

a☆b = 12q(a, 2) + 4b - 5


위 규칙을 적용하면

7☆4 = 47


이것은

유한개의 원인/결과 데이터 정보를 주고

다음에 올 원인 정보에 대하여

결과 정보를 예측하는 것에 속하는 것으로 볼 수 있다.


물론

이러한 종류의 문제에 대한

해답은 무한가지이다.


a☆b = 12q(a, 2) + 4b - 5

그 중 하나의 사례에 지나지 않는다.





인공지능 예측: 36


그러나

요즘에는

사람이 규칙을 생각해내는 것이 아니라

인공지능을 이용하여

규칙을 만들어내도록 한다.


그 규칙은

사람의 뇌를 흉내 낸

복잡하게 엉켜있는 신경망 속에

숨어있는 것 처럼 여겨진다.


원인과 결과에 대한 값을 주고 훈련을 시켜

은밀하게 규칙을 만들어낸 후,

테스트 원인을 그 규칙에 적용하여

테스트 결과를 얻어내는 것이다.


2☆5 = 27

4☆5 = 39

5☆4 = 35

7☆4 = ?


인간은

은밀하게 작용하는

규칙을

알 필요가 없다.


자동차를 운전할 때

자동차 속에 존재하는 내연기관을

모두 알아야 할 필요가 없듯이,

인공신경망 속에

은밀하게 존재하는 규칙 또한 알 필요가 없다.


아래에 소개하는

인공신경망 코드의 경우

내부적으로 작용하고 있는

매개변수들이

8600개가 넘는다.






Python Code


2☆5 = 27

4☆5 = 39

5☆4 = 35

7☆4 = ?



나는 위의 문제를 풀기 위해

다음과 같이

인공 신경망을 구성해 보았다.



import pandas as pd

import numpy as np

import tensorflow as tf

from keras.layers import Dense


print("tf.version: ", tf.version)


# 훈련 데이터

x_data = np.array([[2.0, 5.0], [4.0, 5.0], [5.0, 4.0]])

y_data = np.array([27.0, 39.0, 35.0])


# 데이터 정규화: 각 데이터에서 평균을 뺀 후, 표준편차로 나눈다.

x_mean = x_data.mean()

x_std = x_data.std()

x_data -= x_mean

x_data /= x_std


y_mean = y_data.mean()

y_std = y_data.std()

y_data -= y_mean

y_data /= y_std


model = tf.keras.models.Sequential( [ Dense(units=64, activation='relu', input_shape=(2, )), Dense(units=128, activation='relu'), Dense(units=1, activation='linear') ] ) model.compile(optimizer='adam', loss='mse') model.summary() model.fit(x_data, y_data, epochs=500) # my_list: [2.0, 5.0] def test_predict(my_list): test_data = np.array([my_list]) # 테스트 데이터 정규화 test_data -= x_mean test_data /= x_std print("테스트 데이터: ", test_data) predict_data = model.predict(test_data) # 정규화된 데이터를 원래 데이터로 되돌림. predict_data = int(predict_data * y_std + y_mean) print("predict_data: ", predict_data) test_data = [[2.0, 5.0], [4.0, 5.0], [5.0, 4.0], [7.0, 4.0]] for v in test_data: test_predict(v) print()






문제에 의하면

이를테면

2와 5의 쌍을 주면 27이 나와야 한다.


2☆5 = 27

4☆5 = 39

5☆4 = 35

7☆4 = ?


각각에 대하여

인공지능이 예측한 결과값은 다음과 같았다.

27

39

35

36


27, 39, 35

샘플로 주어진 훈련값에 대해 테스트 해본 것이므로

당연히(? 혹은 비슷하게라도) 나와야 하는 값이고,

36

문제에 대한 예측 결과값이다.


물론 이것 또한

신경망을 어떻게 구성하느냐에 따라 달라질 수 있다.


여기에서는 36이라는 값을 내어놓았지만

신경망을 달리 구성하거나 규칙이 살짝 조정될 경우

이를테면 37이 될 수도 있는 것이다.