Percepron이란 무엇인가?
입력 x가 들어왔을 때
입력 x 들의 가중치를 곱하고
가중치들의 합과 바이어스를 더해서 아웃풋을 만든다
활성화 함수를 사용해서 최종 결과가 나온다
사전적 의미에서
perceptron은 단일 퍼셉트론을 의미하곤 한다.
다층 퍼셉트론은 MLP로 불리게 되는데 XOR 같은 문제를 분류하기 위해서
MLP가 필요하게 된다.
linear classification
linear classifier를 위해서 만들어진 모델이다.
두 가지 클래스가 있을 때 선형적으로 구별할 수 있는 classifier
AND OR XOR
Single neural network의 한계점
XOR 게이트의 경우 single neural network로는 분류를 할 수 없다.
한 개의 선으로는 XOR를 구분할 수 없는 것
Single neural network를 이용해서 학습시켰을 때
X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device)
Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device)
# nn layers
linear = torch.nn.Linear(2, 1, bias=True) #단일 퍼셉트론
sigmoid = torch.nn.Sigmoid() #활성화 함수는 시그모이드를 사용한다.
model = torch.nn.Sequential(linear, sigmoid).to(device)
# define cost/loss & optimizer
criterion = torch.nn.BCELoss().to(device) #이진분류 문제의 경우 Binary class loss 함수를 이용
optimizer = torch.optim.SGD(model.parameters(), lr=1) # 옵티마이저는 SGD를 이용하고 학습률은 1
for step in range(10001): #10000 epoch를 돈다
optimizer.zero_grad() # 가중치를 계속해서 더하게 되어있으므로 0으로 초기화 시켜준다
hypothesis = model(X) # 이론값과 결과값을 비교하기 위해 hypothesis를 모델의 출력값으로 정의
# cost/loss function
cost = criterion(hypothesis, Y) # 코스트를 구한다.
cost.backward()
optimizer.step()
if step % 100 == 0:
print(step, cost.item())
Hidden layer를 사용한 XOR 해결법
Input Layer 에는(0, 0), (0, 1), (1, 0), (1, 1)의 값이 입력해야 하므로 두 개의 뉴런으로 구성하고
Hidden Layer에는 두 개의 직선을 만들기 위해서 두 개의 뉴런이 필요합니다.
그리고 이 둘을 교차시키는 연산이 필요합니다.
Network는 FC(Fully Connected) 구조이며 가중치와 편차를 그림과 같이 설정하고
Activation Function으로는 Sigmoid를 사용합니다.
h1에서 -10에 Activation Function으로 sigmoid를 사용했을 경우 0으로 수렴되어 h1의 출력은 0이 됩니다.
h2에는 30에 sigmoid를 적용해서 출력이 1이 되었습니다. 이 둘의 출력을 Output Layer의 가중치와 편차를 적용하고 sigmoid를 적용하면 0이 출력됩니다. 모든 입력에 대해서 연산을 하면 위의 결과가 나옵니다.
이처럼 MLP를 사용해 Hidden Layer를 이용하면 Single Layer에서 해결하지 못했던
XOR의 문제점을 두 개의 선을 이용해서 분류할 수 있습니다.
가중치와 편차는 학습할 때마다 다르게 나올 것이다.
이는 MLP 학습 특징으로 Back propagation 학습의 특징이라고 합니다.
'ML > 모두의 딥러닝 시즌2' 카테고리의 다른 글
모두의 딥러닝 시즌2 [PyTorch] Lab-01-2 Tensor Manipulation 2 (0) | 2021.01.07 |
---|---|
모두의 딥러닝 시즌2 [PyTorch] Lab-01-1 Tensor Manipulation 1 (0) | 2021.01.05 |
Docker Instruction (0) | 2021.01.05 |