적어도 입력이 둘은 있어야 출력 1개가 나온다. (뉴런이 활성화 된다)
TLU(Threshold Logi unit), LTU(linear threshold unit)
TLU
각각의 TLU는 모든 Input과 연결되어 있다. (한개의 층)
완전연결층의 출력을 계산하는 방법은 각각의 가중합을 계산한 뒤 활성함수에 넣는 것을 말한다.
바이어스는 모든 연결된 가중치에 포함된다.
그 전의 가중치 + 학습률(오차)입력
각 출력 뉴런의 decision boundary를 선형으로 갖는 단층 퍼셉트론은 복잡한 문제를 학습할 수 없다 .
하지만 만약 트레이닝 샘플이 선형구분 된다면 해당 알고리즘은 정답에 수렴한다.
싱글 퍼셉트론은 클래스의 확률을 출력하지 않는다.
이는 로지스틱 회귀를 퍼셉트론보다 더 선호하는 이유이다.
XOR과 같은 문제는 풀지 못한다.
⇒ 따라서 MLP를 사용한다( 다층퍼셉트론)
입력층→은닉층→출력층으로 구성되어 있다.
입력층 → lower layer
출력층 → upper layer
은닉층 ⇒ bias 포함
MLP의 단점: 직관적으로 알기 어렵다 (Black BOX)
deep stack of computation을 말한다
deep stack of hidden layer
역전파 실행과정
그 전의 가중치 + 학습률(오차)입력
Forword Pass (순전파)
Backward Pass (역전파)
활성함수 (은닉층)
loss function
Huber loss란?
2차와 1차 사이에 존재하는 loss fonction
2차의 장점: 빠르고 정밀
1차의 장점: 이상치에 덜 민감
임계값보다 에러가 작으면 quadratic, 임계값보다 에러가 크면 linear를 섞어 쓰는 Loss function
: 케라스 신경망 모델
add로 추가할 것
flatten(입력 이미지 1차원 배열)
dense(은닉층 추가) , 앞에 뉴런개수 설정 가능, activation 함수 설정 가능
summary() → 각 층의 정보 확인 가능
각 층의 파라미터는 이전 층의 뉴런 개수*지금 뉴런의 개수
파라미터 접근을 위한 메서드
가중치를 랜덤으로 초기화할 수 있다. 원한다면 kernel_initializer, bias_initializer()로 설정 가능
complie → 손실함수와 옵티마이저 지정
loss 방법, 옵티마이저 방법, 점수 기준 설정
loss 설정
if) 다중클래스라면
if) 샘플마다 클래스별 타깃 확률을 가진다면 [[0.5, 0.5], [1, 0]]→ categorial_crossentropy
if) 샘플마다 레이블이 정수로 되어있다면[1, 2] → Sparse_categorial_crossentropy
if) 이진, 다중레이블이라면 → sofrmax 대신 sigmoid / binary_crossentropy
sparse label을 one-hot-vector를 사용해 categorial로 바꿀 수 있다.
옵티마이저 설정
SGD, ADAM 등
lr (학습률)설정 가능 → 기본값 0.01
fit → 모델 학습
history
파라미터, 에포크, val set에 대한 손실 측정한 지표
그래프를 그렸을 떄 검증손실은 에포크가 실행되고 나서 계산되고, 훈련손실은 에포크 진행동안 계산되기 때문에 훈련 손실이 에포크의 절반만큼 왼쪽으로 이동해야 한다.
Skewed data
class_weight → 과소표현된 클래스에 더 큰 가중치, 과대표현된 클래스에 더 작은 가중치 주기
per-instance weight → 일회용 가중치
층 수 , 층 속 뉴런 수, 활성함수 타입, 배치사이즈 등을 바꿔본다.
검증 정확도가 만족스러우면 테스트셋으로 일반화 오류를 측정한다. (검증보다 테스트가 성능 낮은게 일반적)
evaluate 사용
predict 사용
샘플별 각 클래스별로 확률 도출된다.
predict_class 사용하면 샘플의 클래스가 뜬다.
분류와 다른 점
분류와 같은 점
wide and deep 모델
: 입력의 일부, 전체가 출력층과 바로 연결된다.
모델은 인풋과 아웃풋만을 정의하고 끝난다.
wide conponent → 일반화된 선형모델을 말한다.
deep component→ feed-forward 모델을 말한다.
일부 특성을 짧은 경로로 전달, 다른 경로를 깊은 경로로 전달할 때 사용된다.
이때, 따로따로 계산한다 (A, B라고 두고 train, test, val 모두 따로따로 계산)
: 보조출력을 추가하는 경우 → 과적합을 줄여 일반화 능력을 향상시킨다.
:동적 모델 만들 때
시퀀셜과 함수형은 선언적이다.
사용 층, 연결 방식 정의 후에 데이터를 주입해 학습한다.
장점
단점
장점
서브클래싱 API는 반복, 다양한 형태 등 구현이 가능
단점
subclassing에서는 model.save 사용 불가능하므로 save_weight(), load_weighr() 사용해야한다.
조기종료 사용
EarlyStopping → 종료에 관여, 직후 어떤 모델의 가중치를 return할지 설정 가능
ModelCheckPoint → 저장에 관여, 직후 어떤 모델의 가중치 리턴할지 관여 안함
두개 같이 사용 가능
검증 로스와 훈련 로스의 비율을 훈련동안 정하기 가능
텐서보드 서버
루트디렉토리 밑에 다른 디렉토리 설정해 기록해 여러번 실행 가능 → 훈련하는 동안 이벤트 파일 만들고 서머리 기록
실행마다 하나의 디렉토리 설정, train, validation으로 서브디렉토리 설정
train에는 성능 병목지점 찾는 profileing trace 존재
기록 가능
많은 파라미터 조합 실행해보고 val set에서 가장 좋은 성능을 내는 파라미터로 설정하기
하이퍼파라미터 공간 탐색 필요
사이킷런은 손실이 아니라 점수를 계산하기 때문에 음수의 MSE나온다.
이때 randomized search가 많이 사용된다→ 하이퍼파라미터 객체가 많기 때문이다.
훈련에 시간이 많이 걸리면 탐색할 파라미터 공간에 제약이 생긴다. → 수동으로 탐색과정을 보조할 수 있으나 시간 많이 든다.
탐색 지역이 더 좋다고 판명될 때 더 탐색을 수행하는 방법이 있음
은닉층이 하나인 MLP여도 뉴런개수 충분하면 복잡한 함수를 모델링 할 수 있다.
하지만 복잡한 문제에서는 심층신경망이 더 좋음
훨씬 적은 양의 뉴런을 사용하므로 성능올라감
과적합 전까지 은닉층 개수 늘린다.
층 증가할수록 뉴런 개수는 줄인다.
그러나 데이터셋에 대해 같은 뉴런수를 쓰기도 하고, 첫번째 층의 뉴런을 다른 것 들보다 아주 키우기도 한다
실전에서 조기정지, 정규화사용하고, stretch pants (늘릴만큼 늘리고 점차줄이는 방법) 사용
최적 파라미터는 최대학습률/2이다.
점진적으로 매우 큰 학습률까지 키워본 다음 수백번 반복해 학습
처음에는 학습률의 손실이 줄어들지만 점차 는다 → 늘어나기 직전이 최적 파라미터
매우 큰 배치는
but
→ 학습률 예열 방법 쓰면 됨
→ 램에 맞는 최대배치 사이즈 쓰면 됨
활성함수
반복횟수(에포크)
하이퍼파라미터를 수정하는 경우 다른 하이퍼 파라미터를 업데이트 해야한다.
최적의 학습률은 다른 파라미터에 의존적이다.