Programmers 인공지능 데브코스 - Week 8 Day 3 - CNN Models

donchanee·2021년 1월 27일
0

기계학습 최적화에서 중요한 점은 일반화 능력이 좋아야 합니다.

MSE 복습

예측값 - 실제값 = 오차

오차를 계산할 때, 어떤 것들을 판단 기준으로 삼느냐에 따라 gradient descent를 이용해 갱신해줄텐데요. 로스나 에러를 어떻게 정해주느냐에 따라 다른 양상을 보일 수 있습니다.

MSE 오차함수에는 큰 허점이 존재합니다. 큰 교정이 필요한 경우에도, MSE는 작은 경사도로 작게 갱신되는 경우가 생깁니다.
로지스틱 시그모이드 함수의 미분값이 값이 커질수록 미분값이 0으로 수렴하기 때문입니다.

이를 해결하는 방법은

  1. ReLU 사용
  2. 목적함수(에러 함수) 바꾸기

이 중 목적함수를 바꾸는 방법중에는 MSE를 교차엔트로피 목적함수로 바꾸는 방법이 있습니다.

교차 엔트로피

P에 대한 확률분포 Q가 있을 때, Q가 P와 얼마나 비슷한지를 나타내는 의미가 있습니다.
위의 엔트로피 활용의 예에서 P의 확률분포 Q가 있을 때, Q의 엔트로피를 구하면,

두 개의 확률분포를 정량화시켜 비교할 수 있는 특징이 있는 것이 교차 엔트로피인데, 정답에 해당하는 y가 확률변수입니다.

신경망에 의해서 1로서 몇 %인지, 0이 몇 %인지 해당하는 클래스 라벨을 예측값 Q라는 출력을 내보냅니다.

크로스 엔트로피의 경우, 값이 커져도 오류가 더 큰 쪽에 더 큰 벌점 ( 경사도 ) 를 부과해서 갱신합니다. MSE의 허점이 수정된 것입니다.

소프트맥스

소프트맥스는 맥스를 모방하여 만들어진 것입니다. 낮은 확률을 가진 녀석들도 합쳐서 1이 될 수 있도록 비율대비해서 나눠준 방식입니다.

소프트맥스에 따르면 큰 값이 더 커질수록 1에 가까운 값이 출력이 될 것입니다. 다른 작은 값들은 0에 가까운 값으로 수렴해나갑니다. 이는 도미넌트한 값이 우세가 되는 추세임을 알 수 있습니다.

음의 로그우도 목적함수 (NLL Loss)

negative log-likelihood

정답인 클래스만 계산해준다는 식

e = -log2oy

모든 출력 노드값을 사용하는 MSE나 교차 엔트로피와 달리 Oy라는 하나의 노드만 값을 적용합니다. 이 Oy는 정답에 해당하는 노드의 출력값입니다.

여기에 Oy에 잘못된 분류를 대입하면, 음의 로그우도 함수 - 목적함수의 값이 크게 됩니다. 정확한 분류를 대입했을 때 제대로 분류한 셈이기 때문에 목적함수의 값이 작아지게 됩니다.

소프트맥스일 경우 로그우도를 사용하고, 하나의 정답만 확인해서 에러를 구한다음 오류역전파를 할 수 있습니다. 소프트맥스는 최댓값이 아닌 값을 억제하여 0에 가깝게 만든다는 의도를 내포하고 있습니다.
신경망에 의한 샘플의 정답에 해당하는 노드만 보겠다는 로그우도와 궁합이 잘 어울려 둘을 결합하여 사용하는 경우가 많습니다.

소프트맥스는 unnormalized probabilities 과정 - exp 함수를 적용해서 0 위로 값을 모두 올려주는 과정을 지나서, 정규화 과정을 거치면 0-1 사이의 확률값으로 변화합니다. 이 후 음의 로그우도를 적용해서 값을 구하던지 하면 됩니다. ( 원-핫 코드와 비슷 )

정확한 분류일 경우 작은 값, 정확하지 않은 분류일 경우 큰 값을 주어서 갱신을 크게 만들어준다는 장점이 있습니다.

MSE 말고도 hinge loss 같은 함수가 있지만 잘 쓰지 않습니다.

데이터 전처리

규모의 문제

건강에 관련된 데이터 키, 몸무게, 혈압을 수집했다고 가정합니다.

1.8m 와 1.5m 는 30cm 차이지만 특징값을 차이는 불과 0.3이고,
65kg과 60kg은 5이라는 차이가 생깁니다. 스케일이 다른 문제가 있습니다.

몸무게의 스케일이 크기 때문에 키와 값의 규모의 차이가 100배가 나고, 중요하지 않은 요소가 도미넌트하게 특징을 잡아먹을 수 있는 의존성이라는 것이 많이 생길 수 있습니다.

불균형한 학습이 이루어지게 되어서 느린 학습의 요인이 됩니다.

모든 특징이 양수인 경우의 문제

모두 양수인 경우에, 가중치가 뭉치로 증가하거나 감소하면 최저점을 찾아가는 경로가 갈팡질팡하게 느리게 수렴하게 됩니다.

모두 같은 방향이기 때문에 한꺼번에 흔들리는 문제가 생깁니다.

문제 해결

정규화는 규모 문제와 양수 문제를 해결해줍니다.

정규 분포를 사용해서 표준화 변환을 적용하는 경우가 있습니다.
평균이 0이 되도록 변환하고, 분산으로 나눠서 표준편차가 1이 되도록 변환합니다.
각각의 축(키, 몸무게, 혈압)마다 편향시키는 것입니다.

많이 쓰이진 않지만 최대 최소 변환을 적용할 수도 있습니다.
0-1까지의 스케일로 바뀌지만, 이것은 양의 값의 문제를 해결하지 못했습니다. 그래서 -0.5~0.5 사이의 값으로 변환하는 방법으로 사용하긴 한답니다.

명목 변수를 원핫 코드로 변환

명목 변수란 객체간 서로 구분하기 위한 변수입니다. (norminal value) 예를 들어 성별의 남(1), 여(2), 체질의 태양인(1), 태음인(2), 소양인(3), 소음인(4) 같은 것들이 있습니다.

이는 거리 개념이 없습니다. 원핫 코드는 값의 개수만큼 비트를 부여합니다. 고로 성별은 2비트, 체질은 4비트를 부여합니다.

임베딩을 사용하면 비효율적인 비트를 생성하는 것을 막을 수 있습니다.

가중치 초기화

가중치를 최적화시켜야 하는데, 어디서부터 시키냐에 따라 양상이 달라집니다.

대칭적 가중치 문제

모든 값들이 대칭적으로 연결되거나 동일한 값으로 세팅되는 경우의 문제입니다. 이러한 일이 있을 때 가중치가 같기 때문에 층을 통과해도 결과값이 똑같은 문제가 발생합니다.

대칭성을 파괴하기 위해 가중치를 초기화할 때 난수로 초기화합니다.
난수를 추출할 때 가우시안이나 Uniform 분포에서 난수를 추출합니다. 난수의 범위를 결정하는 것이 중요합니다.

nin는 차원의 수이고 만약 10개의 차원이 들어온다면 +- 루트 10 분의 1 정도의 값으로 범위를 결정합니다.

가중치를 적절하게 초기화시켜야, 학습이 잘 될수 있습니다. 활성화 함수에서 발현이 안될수도 있고, 양 극단값이 포화되서 학습이 어려울 수 있기 때문입니다.

deeplearning.ai/ai-notes/initialization

모멘텀 (탄력)

경사도의 잡음 현상

확확 바뀌는 경우가 생길 수 있습니다. 풀 배치의 gradient descent를 사용하는게 좋고, 풀 배치보다 미니 배치를 사용하는게 좋은 이유도 이러한 이유입니다. 이를 조금 더 부드럽게 사용하는 방법이 모멘텀입니다.

관성에 의해서 경사에서 공을 굴렸을 때 가려고 하는 모멘텀을 이용하겠다고 하는 것이 경사도에 대한 모멘텀입니다.

경사도에 부드러움을 가하여서 잡음 효과를 줄이는 방법입니다. 과거에 이동했던 방식을 기억하면서 기존 방향으로 일정 이상 추가 이동합니다.

Local Minima나 Saddle points(미분 값이 사라지는 구간-기울기 0)에서 관성에 의해 이런 부분들을 넘어갈 수 있게 만드는 것입니다.
매개변수의 개수가 많아지며, 고차원의 공간을 탐색하기 때문에 로컬 미니마보다 새들 포인트(안정점)가 많아집니다.

과거의 기울기를 이용하여 모멘텀을 구할 수 있습니다.


L : loss function value
W : weights
η : learning rate
α : 가속도 같은 역할을 하는 hyper parameter, 0.9 등 1 이하의 값을 취함.


처음 v는 0으로 출발하고
보통 α는 0.5, 0.9 등등을 사용하여 epoch가 지남에 따라 점점 키워서 0.99에 도달하는 방법을 사용합니다.

관성(모멘텀)의 효과로는 이리저리 왔다갔다하는 오버슈팅 현상을 누그러뜨립니다.

네스테로프 가속 경사도

모멘텀에 따라 이동시켜 둔 후에, 경사도를 구해서 결과적인 갱신이 된다는 방식입니다.

수렴이 조금 더 잘되는 장점이 있습니다.

학습률 (learning late) p의 중요성

너무 크면 오버슈팅이 일어나서, 너무 작으면 수렴이 느립니다.

기울기에 학습률 p를 곱한다고 하는 것이 각각의 경사도에 동일한 러닝레이트를 곱하는 것입니다. 이는 타원형같은 모양에서 각각 다른 학습률이 필요하다는 생각으로 발전했습니다.

적응적 학습률 (adaptive learning rates)

적응적 학습률은 매개변수마다 자신의 상황에 따라 학습률을 조절해서 사용합니다.

탐색을 할 때, 초기에는 자유도가 크게끔 탐색을 하고, 수렴이 되어감에 따라 자유도를 줄여가겠다는 방법입니다. 과거의 경사도와 지금의 경사도가 비슷하다고 하면 그것이 같은 방향으로 진행하고 있기 때문에 수렴에 가까워지고 있다고 판단할 수 있기 때문에, 부호가 같은 매개변수는 값을 키우고 부호가 다른 매개변수는 값을 줄이는 방식입니다.

AdaGrad (Adaptive Gradient)

AdaGrad가 적응적 학습률을 적용한 예이다. 값을 갱신하는 분모부분에 r이라는 이전 경사도를 누적한 벡터가 존재하고, 방향이 같으면 이 값이 커져서 전체 값이 낮아지기 때문에 천천히 이동하고 vice versa도 마찬가지이다. r값이 작을 때는 초기에 값이 많이 없을 때 확확 이동할 수 있다.

AdaGrad의 단점은 r값을 구할 때,

r = r + g*g

이기 때문에 오래된 경사도와 최근 경사도는 같은 비중의 역할을 합니다.

이를 해결하기 위해 RMSProp이 생겼는데, 가중 이동 평균 기법을 적용해서

r = ar + (1-a)g*g

이렇게 수정하여 사용합니다. 알파가 작을수록 최근 것에 비중을 둡니다.

RMSProp에 모멘텀을 추가로 적용한 것이 Adam이라고 불리는 학습률입니다. Adam은 Adaptive Moment의 줄임말입니다.

Adam을 많이 사용하고 있어서 잘 모르겠다 싶으면 이걸 많이 씁니다. 그치만 노하우가 있다면, SGD에다가 학습률을 노하우를 통해 조금씩 변화를 시키면서 하는 것이 성능적인 측면에서 이점이 있습니다.

이러한 옵티마이저들은 프레임워크 등에서 제공이 되고 있습니다.

0개의 댓글