- 출처
- 되도록이면 책의 내용과 코드를 그대로 옮기기 보다는 요약과 보충설명!
읽기전에
개념 정리
후버 손실
MSE와 MAE의 특징
MSE와 MAE의 조합, 후버 손실
python 정리
12장 텐서플로를 사용한 사용자 정의 모델과 훈련
Why Tensorflow?
- 구글에서 개발, 가장 널리 쓰이는 딥러닝 라이브러리
- 넘파이와 비슷해 보이지만, GPU를 지원
- 다양한 연산 기능 제공
- 커널(kernel)
- 파이썬 API이외에도 C++, Java, Go, Swift 도 사용 가능
- 대부분 keras와 같은 고수준 API를 사용하지만, 직접 모델의 세부사항을 조정하고 싶을 경우 저수준 API를 사용(ops)
- 텐서플로의 향상을 위한 개발자들 존재
- 번역도 존재
넘파이처럼 텐서플로 사용하기
tf.constant()
로 텐서를 만들 수 있음. 넘파이와 비슷하게 작동하지만, 연산 함수명은 조금 다름.
- 넘파이 배열로 텐서를, 텐서로 넘파이 배열을 만들 수 있음. 서로에게 상대의 연산을 적용할 수도 있음.
- 타입 변환은 성능을 크게 감소시킬 수 있기 때문에 텐서플로는 타입 변환이 자동으로 이루어지지 않음.
tf.Tensor()
: 변수의 내용을 바꿀 수 없는 객채.
tf.Variable()
: 변숫값 변경이 가능.
기타 다른 데이터 구조
- 희소 텐서
- 텐서 배열
- 래그드 텐서
- 문자열 텐서
- 집합
- 큐
사용자 정의 모델과 훈련 알고리즘
사용자 정의 손실 함수(loss fuction)
- 후버 손실(Huber loss)(더보기)
- 손실, 규제, 제한, 초기화, 지표, 활성화 함수, 층, 모델과 같은 대부분의 케라스 기능은 유사한 방법으로 커스터마이징이 가능. 즉 대부분 적절한 입력과 출력을 가진 간단한 함수로 만들면 된다.
사용자 정의 지표
- 손실? 지표?
: 둘은 개념적으로는 같으므로 사용자 함수를 만드는 방법은 동일하지만, 둘의 쓰임은 다르다.
- 손실: 모헬 훈련을 위한 경사 하강법에서 사용. 미분 가능하며 gradient가 모든 곳에서 0이 아니어야 함. 이해하기 어려워도 괜찮음.
- 지표: 모델 평가시 사용. 이해하기 쉬워야 함. 미분 가능 혹은 gradient 상관 없음.
- 딥러닝시에 손실을 지정하고 해석 가능성을 위해 지표도 지정하곤 함
- 스트리밍 지표
: 각 배치마다 얻는 정밀도를 기록하고 전체 정밀도를 계산. 배치마다 점진적으로 업데이트 됨.
사용자 정의 층
사용자 정의 모델
: keras.Model
클래스를 상속하여 생성자에서 층과 변수를 만들고, 모델이 해야 할 작업을 call()
매서드에 구현한다.
모델 구성 요소에 기반한 손실과 지표
- 재구성 손실: 재구성과 입력 사이의 평균 제곱 오차(MSE)
: 모델이 hidden layer를 통과하면서 가능한 많은 정보를 유지하도록 유도.
자동 미분을 사용하여 그레이디언트 계산하기
사용자 정의 훈련 반복
텐서플로 함수와 그래프
- 파이썬 함수를 텐서플로 함수로 변환하면 더 빠르다!
오토그래프와 트레이싱
텐서플로 함수 사용 방법
- 텐서플로 그래프는 텐서플로 구성 요소만 포함.
- 함수 안에서 일어나는 다른 함수 호출은 자동으로 그래프 모드로 적용. ??
- 함수에서 텐서플로 변수를 만든다면, 처음 호출될 때만 수행되어야하고 그 외에는 예외가 발생함.
- 소스 코드가 사용 가능해야 한다.
- 반복문:
for i in ragne(x)
보다 for i in tf.range(x)
를 사용
- 성능면에서 반복문보다 가능한 한 벡터화된 구현을 사용하는 것이 좋음.
궁금증
- 후버 손실으 MSE나 MAE 보다 좋아보이는데, 왜 우리는 MSE나 MAE를 써왔나?
- 단점: threshold를 지정해 줘야 함.
- 머신러닝 돌리고 계속해서 최적값 찾아야함.
- 강력회귀분석: 이상치에 덜 민감한(robust) 모델 만들때 사용
실무에서는 후버손실을 많이 쓰나? 궁금