문제 1~2
다음 <보기> 를 읽고 문제에 답하세요.
<보기>
뉴런이라는 것을 상상해보라고 한다면, 여러 연결 신경으로부터 자극을 받아서 충분한 자극을 받는다면 뉴런에 불이 짠 들어오는 모습을 떠올리곤 한다.
컴퓨터에서도 뉴런은 weight 과 bias 로 이루어진다. weight 는 특정 입력이 다른 입력에 비해 좀 더 중요한 값이 되게 한다. 이 값이 0이라면 뉴런의 출력값에 전혀 영향을 주지 않는다고 생각할 수 있다. bias 는 일종의 threshold로써 결과 값이 정해지는(?) 범위를 조정 한다.
예를 들어 맛있는 것을 먹을 때 업된 기분을 만들어주는 도파민이라는 호르몬의 분비를 담당하는 뉴런이 있다고 상상해 보자. 그 뉴런은 달콤한 자극, 짭짤한 자극, 새콤한 자극, 매운 자극, 씁쓸한 자극 등의 미각 입력을 받아 하나의 출력을 내보내는 함수일 것이다. 이 뉴런에 들어온 자극의 합이 작으면 아무것도 하지 않고(0) 충분히 크다면 도파민을 분비하라는 명령(1) 이 출력값으로 실행되며 행복한 감정을 느낄 수 있게 된다.
대부분의 사람들은 씁쓸한 것을 먹을 때 행복해하지 않는다. 씁쓸한 자극 입력에 대해 곱해지는 가중치(weight) 는 0에 가까울 것이다. 반면 내가 매운것을 먹을 때 너무나 행복한 사람이라면 매운맛 입력에 곱해지는 가중치가 높을 것이다. 내가 무엇을 먹든지에 상관없이 쉽게 도파민이 분비되는 그런 매사에 행복한 사람이라면 bias 가 낮다고 모델링할 수 있다..
문제1 : 주관식
[1] 다른 입력에 비해 좀 더 중요한 값이 되게
[2] 일종의 threshold로써 결과 값이 정해지는(?) 범위를 조정
문제2 : 객관식
문맥상 [3] 과 [4] 에 적절한 응답은?
1. [3] 너무나 행복한 사람이라면 [4] bias 가 낮다고 모델링할 수 있다.
1.
[3] 너무나 행복한 사람이라면 [4] bias 가 낮다고 모델링할 수 있다.
2.
[3] bias 가 낮은 사람이라면 [4] bias 가 낮다고 모델링할 수 있다.
3.
[3] 너무나 슬픈 사람이라면 [4] variance 가 낮다고 모델링할 수 있다.
4.
[3] 너무나 슬픈 사람이라면 [4] bias 가 낮다고 모델링할 수 있다.
문제 3~4
다음 코드와 <보기> 를 읽고 문제에 답하세요
import math
import numpy as np
def sigmoid(x):
return 1 / (1 + math.exp(-x))
class Neuron:
def __init__(self,
input_dim:int,
initial_weight:np.array,
initial_bias:float,
activation_fn=None,
):
if type(initial_weight) is list:
initial_weight = np.array(initial_weight)
assert input_dim == initial_weight.shape[0]
self.w = initial_weight
self.b = initial_bias
self.y = None
if activation_fn is None:
activation_fn = sigmoid
self.activation_fn = activation_fn
def forward(self,x):
return np.sum(x * self.w) + self.b
def __call__(self,x):
if type(x) is list:
x = np.array(x)
self.x = x
self.y = self.activation_fn(self.forward(x))
return self.y
a = Neuron(input_dim=3, initial_weight=[1,1,1], initial_bias=1)
print(repr(a([2,3,4])))
Python
복사
문제3 : 객관식
위 코드에 나타난 뉴런을 함수 라고 했을 때,
정의역과 치역에 대한 정의를 올바르게 설명한 것은?
2
1.
2.
3.
4.
정답 없음
문제4 : 코드
return self.get_dy_dx()*next.dy_dx[next._find(self)]
<보기1>
위 코드의 Module 클래스에는 다음과 같은 함수가 들어 있습니다. 현재 모듈의 로컬 그래디언트는 self.get_dy_dx() 에서 받아옵니다. 문제는 이 컴퓨테이션 그래프가 다음 모듈에 연결되어 있는 경우(if nexts) 현재 모듈의 그래디언트를 구해 반환하는 함수에 현동이가 물을 쏟아 버려 지워져 버렸다는 것입니다.
class Module(FunctionLike):
...
def cal_dy_dx(
self,
):
nexts = self.next_modules
if nexts:
for next in nexts:
raise NotImplementedError
else:
return self.get_dy_dx()
Python
복사
<보기2>
아래 코드 조각의 순서를 조절해서 raise NotImplementedError 부분을 고칠 수 있습니다. 딱 한 줄만 작성하면 되고, 다른 코드를 전혀 건드리지 않아도 되고, 코드 전체를 모두 이해할 필요도 전혀 없습니다.
return
*
self.get_dy_dx()
next.dy_dx
[next._find(self)]
Python
복사
정상적으로 동작하는 경우 셀 출력은 다음과 같습니다.
add_1: {'x': None, 'y': None, 'next_modules': [<__main__.Mul object at 0x7feb8e55f350>], 'prev_modules': []}
add_2: {'x': None, 'y': None, 'next_modules': [<__main__.Mul object at 0x7feb8e55f350>], 'prev_modules': []}
mul_1: {'x': None, 'y': None, 'next_modules': [], 'prev_modules': [<__main__.Add object at 0x7feb8e55f290>, <__main__.Add object at 0x7feb8e55f250>], '_prev_modules_res': [False, False]}
add_1: {'x': array([5., 3.]), 'y': 8.0, 'next_modules': [<__main__.Mul object at 0x7feb8e55f350>], 'prev_modules': [], 'dy_dx': array([7., 7.])}
add_2: {'x': array([3., 4.]), 'y': 7.0, 'next_modules': [<__main__.Mul object at 0x7feb8e55f350>], 'prev_modules': [], 'dy_dx': array([8., 8.])}
mul_1: {'x': array([8., 7.]), 'y': 56.0, 'next_modules': [], 'prev_modules': [<__main__.Add object at 0x7feb8e55f290>, <__main__.Add object at 0x7feb8e55f250>], '_prev_modules_res': [8.0, 7.0], 'dy_dx': array([7., 8.])}
Python
복사
<보기1> 에서 현동이가 물을 쏟은 부분을 수정하여 가장 마지막 셀에 오류가 없도록 고쳐 보세요. 그리고 코드의 의미를 간단히 설명하세요. (코드를 작성하지 못해도 의미를 정확히 설명하면 0.5점)
주관식 문제5
빈 칸에 들어갈 말을 아래 선택지에서 고르세요
인간의 뉴런이 컴퓨터의 이진 회로와 유사하다는 사실에 착안해 인간의 신경세포 뉴런을 모방하여 기계적으로 구현한 것이 [
]이다. [
]으로 컴퓨터 연산의 기초가 되는 And Gate, OR Gate 등 기본 논리 회로의 연산을 해결하였다. 이때, Perceptron은 And 혹은 OR 과 같은 선형 분리가 가능한 문제는 해결할 수 있지만, 선형(linear) 방식으로 데이터를 구분할 수 없는 오른쪽 아래 그림과 같은 XOR 문제에는 적용할 수 없다는 한계점이 대두되면서 인공 신경망 연구에 침체기를 갖게 된다.
이때 1986년 제프리 힌튼이 [
]과 [
]을 실험적으로 증명하면서 암흑기를 깨고 인공 신경망 연구가 다시 되살아나게 된다.
기존의 퍼셉트론으로는 XOR 문제를 해결할 수 없었지만, Hidden-Layer를 추가함으로써, 또 Feed forward 연산 이후 다시 반대로 오차를 보내는 방법으로 가중치 값을 업데이트 하는 방법으로 XOR 문제를 해결하였다.
앞서 있던 문제는 해결되었지만 곧이어 다른 한계점이 보이기 시작한다. 바로 더 깊고 더 넓은 신경망을 학습시키는 과정에서 [
]가 발생한다. 인공신경망의 계층이 많아질수록 학습에 중요한 역할을 하는 가중치 조정이 제대로 되지 않은 것이다. 이렇게 인공지능의 두 번째 겨울이라 불리는 침체기를 맞는다.
문제6
MLP와 Convolution 비교
•
MLP
MLP는 모든 뉴런들이 선형모델과 활성함수로 모두 연결된 fully connected 구조로, 각 픽셀마다 할당된 가중치가 존재한다.
문제7
Multi-Layer Perceptron(MLP)은 영상이나 이미지를 처리하는데 있어서 문제점을 가지고 있다.
위 사진처럼 숫자 1을 MLP로 인식한다고 예를 들면, 같은 숫자 1임에도 불구하고 좌측으로 한 칸씩만 이동해도 인풋값이 20개가 변화한다. 이는 학습해놓은 weight들이 무력화되는 결과를 가져온다.
이를 해결하기 위해 위치나 기울기 등이 아닌 특징을 찾아서 이미지를 인식하는 방법을 사용하기로 한다.
처음에는 가장 기초가 되는 특징(feature)부터 확인하고 그 특징들을 조합해서 보다 복잡한 특징이 존재하는지 살펴본 뒤 마지막으로 물체를 분류하는 과정이다. 이런 기능을 하는 [
]의 구조는 다음과 같다.