K 개발자
인공 신경망이란 본문
생물학적 뉴런에서 인공 뉴런까지
퍼셉트론perceptron
가장 간단한 인공 신경망 구조 중 하나로 TLUthreshold logic unit 또는 LTUlinear threshold unit라고 불리는 조금 다른 형태의 인공 뉴런을 기반
TLU는 입력의 가중치 합을 계산한 뒤 계산된 합에 계단 함수step function를 적용하여 결과를 출력 (i.e. $h_ {w}(x)=step(z)$, $z=x^{T}w$)
헤비사이드 계단 함수Heaviside step function
퍼셉트론에서 일반적으로 사용하는 계단 함수 (임곗값을 0으로 가정)
부호 함수sign function를 대신 사용하기도 한다.
$\text{heaviside}(z)=\begin{cases}0 & z<0\text{일 때} \\ 1 & z\geq 0\text{일 때} \end{cases}$
$\text{sgn}(z)=\begin{cases}-1 & z<0\text{일 때} \\ 0 & z=0\text{일 때} \\ +1 & z>0\text{일 때} \end{cases}$
완전 연결 층fully connected layer(밀집 층dense layer)
한 층에 있는 모두 뉴런이 이전 층의 모든 뉴런과 연결되어 있을 때 위와 같이 부른다.
퍼셉트론은 층이 하나뿐인 TLU로 구성되고 각 TLU는 모든 입력에 연결
퍼셉트론의 입력은 어떤 입력이 주입되든 그냥 출력으로 통과시키는 입력 뉴런input neuron에 주입
입력층input layer은 모든 입력 뉴런으로 구성되고 보통 거기에 편향 특성이 더해진다. ($x_ {0}=1$)
$h_ {w,b}(X)=\phi (XW+b)$
- $X$는 입력 특성의 행렬 (행은 샘플, 열은 특성)
- 가중치 행렬 $W$는 편향 뉴런을 제외한 모든 연결 가중치를 포함 (행은 입력 뉴런, 열은 출력층에 있는 인공 뉴런)
- 편향 벡터 $b$는 편향 뉴런과 인공 뉴런 사이의 모든 연결 가중치를 포함 (인공 뉴런마다 하나의 편향값이 있다.)
- $\phi$를 활성화 함수activation function라고 부른다. (인공 뉴런이 TLU일 경우 계단 함수)
퍼셉트론 학습 규칙(가중치 업데이트)
${w_ {i,j}}^{\text{(next step)}}=w_ {i,j}+\eta (y_ {j}-\hat{y}_ {j})x_ {i}$
- $w_ {i,j}$는 $i$번째 입력 뉴런과 $j$번째 출력 뉴런 사이를 연결하는 가중치
- $x_ {i}$는 현재 훈련 샘플의 $i$번째 뉴런의 입력값
- $\hat{y}_ {j}$는 현재 훈련 샘플의 $j$번째 출력 뉴런의 출력값
- $y_ {j}$는 현재 훈련 샘플의 $j$번째 출력 뉴런의 타깃값
- $\eta$는 학습률
다층 퍼셉트론(MLP)과 역전파
다층 퍼셉트론은 입력층 하나와 은닉층hidden layer이라 불리는 하나 이상의 TLU층과 마지막 출력층output layer으로 구성
입력층과 가까운 층을 보통 하위 층lower layer, 출력에 가까운 층을 상위 층upper layer이라고 부른다.
출력층을 제외하고 모든 층은 편향 뉴런을 포함하며 다음 층과 완전히 연결되어 있다.
은닉층을 여러 개 쌓아 올린 인공 신경망을 심층 신경망deep neural network(DNN)이라 한다. (딥러닝)
역전파backpropagation
각 훈련 샘플에 대해 역전파 알고리즘이 먼저 예측을 만들고 (정방향 계산forward pass) 오차를 측정
역방향으로 각 층을 거치면서 각 연결이 오차에 기여한 정도를 측정 (역방향 계산)
이 오차가 감소하도록 가중치를 조정 (경사 하강법)
활성화 함수
계단 함수에는 수평선밖에 없으니 계산할 그레이디언트가 없다.
층 사이에 비선형성을 추가해서 복잡한 문제를 풀 수 있게 한다. (Logit, Tanh, ReLU)
회귀를 위한 다층 퍼셉트론
하이퍼파라미터 | 일반적인 값 |
---|---|
입력 뉴런 수 | 특성마다 하나(e.g. MNIST의 경우 28x28=784) |
은닉층의 수 | 문제에 따라 다름, 일반적으로 1에서 5 사이 |
은닉층의 뉴런 수 | 문제에 따라 다름, 일반적으로 10에서 100 사이 |
출력 뉴런 수 | 예측 차원마다 하나 |
은닉층의 활성화 함수 | ReLU (또는 SELU) |
출력층의 활성화 함수 | 없음, 또는 (출력이 양수일 때) ReLU/softplus나 (출력을 특정 범위로 제한할 때) logistic/tanh를 사용 |
손실 함수 | MSE나 (이상치가 있다면) MAE/Huber |
분류를 위한 다층 퍼셉트론
하이퍼파라미터 | 이진 분류 | 다중 레이블 분류 | 다중 분류 |
---|---|---|---|
입력층과 은닉층 | 회귀와 동일 | 회귀와 동일 | 회귀와 동일 |
출력 뉴런 수 | 1개 | 레이블마다 1개 | 클래스마다 1개 |
출력층의 활성화 함수 | 로지스틱 함수 | 로지스틱 함수 | 소프트맥스 함수 |
손실 함수 | 크로스 엔트로피 | 크로스 엔트로피 | 크로스 엔트로피 |
다층 퍼셉트론 구현하기
시퀀셜Sequential API
순서대로 연결된 층을 일렬로 쌓아서 구성
함수형functional API
입력과 출력이 여러 개거나 더 복잡한 네트워크 토폴로지를 갖는 신경망을 만들어야 할 때
서브클래싱subclassing API
반복문을 포함하고 다양한 크기를 다루어야 하며 조건문을 가지는 등 여러 가지 동적인 구조가 필요할 때
모델 저장과 복원
일반적으로 하나의 파이썬 스크립트에서 모델을 훈련하고 저장한 다음 하나 이상의 스크립트(또는 웹 서비스)에서 모델을 로드하고 예측을 만드는 데 활용
콜백callback 사용하기
컴퓨터에 문제가 생겨 모든 것을 잃지 않으려면 훈련 마지막에 모델을 저장하는 것뿐만 아니라 훈련 도중 일정 간격으로 체크포인트checkpoint를 저장해야 한다.
텐서보드를 사용해 시각화하기
텐서보드는 좋은 인터렉티브 시각화 도구
훈련하는 동안 학습 곡선을 그리거나 여러 실행 간의 학습 곡선을 비교하고 계산 그래프 시각화와 훈련 통계 분석을 수행
또한 모델이 생성한 이미지를 확인하거나 3D에 투영된 복잡한 다차원 데이터를 시각화하고 자동으로 클러스터링을 해주는 등 많은 기능을 제공
신경망 하이퍼파라미터 튜닝하기
은닉층 개수
복잡한 문제에서는 심층 신경망이 얕은 신경망보다 파라미터 효율성parameter efficiency이 좋다.
은닉층의 뉴런 개수
데이터셋에 따라 다르지만 다른 은닉층보다 첫 번째 은닉층을 크게 하는 것이 도움이 된다.
한 층의 뉴런 수가 적으면 입력에 있는 유용한 정보를 모두 유지하기 위한 충분한 표현 능력을 가지지 못한다.
학습률, 배치 크기 그리고 다른 하이퍼파라미터
학습률
좋은 학습률을 찾는 한 가지 방법은 매우 낮은 학습률에서 시작해서 점진적으로 매우 큰 학습률까지 수백 번 반복하여 모델을 훈련하는 것
학습률에 대한 손실을 그래프로 그리면 처음에 손실이 줄어드는 것이 보이다가 학습률이 커지면 손실이 다시 커진다.
최적의 학습률은 손실이 다시 상승하는 지점보다 조금 아래
다른 하이퍼파라미터에 의존적 (다른 하이퍼파라미터를 수정하면 반드시 튜닝)
옵티마이저
고전적인 평범한 미니배치 경사 하강법보다 더 좋은 옵티마이저를 선택하는 것(이 옵티마이저의 하이퍼파라미터를 튜닝하는 것)도 중요
배치 크기
GPU 램에 맞는 가장 큰 배치 크기 사용을 권장
학습률 예열 (i.e. 작은 학습률로 훈련을 시작해서 점점 커진다.) 같은 다양한 기법을 사용해 큰 배치 크기를 시도
훈련이 불안정하거나 최종 성능이 만족스럽지 못하면 작은 배치 크기를 사용
활성화 함수
일반적으로 ReLU 활성화 함수가 모든 은닉층에 좋은 기본값
출력층의 활성화 함수는 수행하는 작업에 따라 다르다.
반복 횟수
튜닝하는 대신 조기 종료를 사용
실습코드링크 : 인공 신경망과 케라스에 대한 소개