래빗 챌린지 - 심층 학습 Day1 Section3 출력 레이어

0. 개요



본 기사는 일본 딥 러닝 협회 인정의 강좌 프로그램인 「래빗 챌린지」가 제공하고 있는 과목의 하나인 심층 학습의 리포트이다.
기사 타이틀에 기재된 바와 같이, Day1 Section3의 출력층에 대해서 이하에 정리한다.

1. 출력층



분류이면 각 클래스에 속하는 확률 등 사람이 원하는 최종 결과를 출력한다.
학습에서,이 출력 레이어의 결과와 목표 변수의 값을 비교하고, 얼마나 잘 맞는지, 어긋나는지를 계산하기 위해 오차 함수가 사용됩니다.

2. 오차 함수



예를 들면 분류의 경우, 각 클래스가 속하는 확률과 One-hot 벡터로 표현되고 있는 각 클래스의 정답값을 기초로 얼마나 맞는지, 어긋나 있는지 산출한다.
어긋나 있을수록 값은 커진다.

이진 분류의 경우 크로스 엔트로피 함수, 다른 클래스 분류의 경우 카테고리 칼 크로스 엔트로피 함수, 회귀의 경우 평균 제곱 오차, 평균 절대 오차 등이 사용됩니다.

2.1. 평균 제곱 오차



평균 제곱 오차는 지금까지 동일.
def mean_squared_error(y, d):
  return np.mean(np.square(y-d)) / 2

np.square는 제곱을 나타냅니다.

2.2. 교차 엔트로피 함수


E_{n}(w)=-\sum_{i=1}^{I}{d_{i}log\ y_{i}}
def cross_entropy_error(d, y):
  if y.ndim == 1:
    d = d.reshape(1, d.size)
    y = y.reshape(1, y.size)

  # 
  if d.size == y.size:
    d = d.argmax(axis=1)

  batch_size = y.shape[0]
  return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7) / batch_size

3. 활성화 함수



중간층의 경우는 입력값의 신호의 강약을 조정(가중치)하기 위해서 사용되지만, 출력층의 경우는 신호의 크기는 그대로 분류의 확률이나 회귀의 연속값 등으로 변환한다.

3.1. 시그모이드 함수



Section2라고 쓴 식, 코드를 참조.
로지스틱 회귀에서 사용할 때와 같고 2치 분류로 1의 클래스에 해당하는 확률을 출력한다.
1의 클래스에 해당하는 확률, 1의 클래스에 해당하지 않는 확률(0의 클래스에 해당하는 확률)을 합하면 1이 된다.

3.2. 소프트 맥스 함수



각 클래스에 해당하는 확률을 출력한다.
클래스 수 $K$의 모든 확률을 합하면 1이 된다.
다른 클래스 분류 (3 클래스 이상)에 사용된다.
f(i,u)=\frac{e^{u_{i}}}{\sum_{k=1}^{K}{e^{u_{k}}}}
def softmax(x):
  if x.ndim == 2:
    x = x.T
    x = x - np.max(x, axis=0)
    y = np.exp(x) / np.sum(np.exp(x), axis=0)

    return y.T

  x = x - np.max(x)  # オーバーフロー対策
  return np.exp(x) / np.sum(np.exp(x))

4. 확인 테스트



4.1. 확인 테스트 1



이번에 사용하고 있던 오차 함수, 평균 제곱 오차에서 왜 예측과 목적 변수를 뺄 뿐만 아니라 제곱하는가.

답변:
양의 방향으로 어긋나 있는지 음의 방향으로 어긋나 있는지의 2 패턴을 생각할 수 있지만, 정 부의 값이 혼재하고 있으면 총합을 했을 때 올바르게 오차를 합계할 수 없기 때문.
분산과 같은 생각.

4.2. 확인 테스트 2



평균 제곱 오차에서 왜 1/2하는가?

답변:
표현의 단순화를 위해.
제곱 부분은 미분하면 2가 앞으로 나오기 때문에 1/2을 두는 것으로 상쇄될 수 있다.
오차라는 의미에서는 변하지 않으므로 1/2이 있어도 좋지 않아도 좋다. 기계 학습의 강좌였던 것처럼 $n$로 나누어 평균으로 해도 좋다.

4.3. 확인 테스트 3



소프트 맥스 함수의 수식에 해당하는 코드에 대해 한 줄씩 처리를 설명하라.

답변:
def softmax(x):
  if x.ndim == 2:    # 2次元の場合。
    x = x.T          # xを転置
    x = x - np.max(x, axis=0)  # xから列方向(縦に見て)取った最大値を引く。スケーリング?
    y = np.exp(x) / np.sum(np.exp(x), axis=0) # xの指数関数の値(数式の分子)を指数関数の総和(数式の分母)で割って確率としている。

    return y.T

  x = x - np.max(x)  # オーバーフロー対策
  return np.exp(x) / np.sum(np.exp(x))

4.4. 확인 테스트 4



교차 엔트로피 함수의 수식에 해당하는 코드에 대해 한 줄씩 처리를 설명하라.

답변:
def cross_entropy_error(d, y):
  if y.ndim == 1:    # 1次元の場合。例えば(3,)みたいな形状。
    d = d.reshape(1, d.size)    # (1, 全要素数)のベクトルに変形
    y = y.reshape(1, y.size)    # (1, 全要素数)のベクトルに変形

  # 教師データが one-hot-vector の場合、正解ラベルのインデックスに変換
  if d.size == y.size:
    d = d.argmax(axis=1)  # argmaxで最大値(予測の最も確からしいクラス)のインデックスを取得

  batch_size = y.shape[0] # この場合は行の形状なので1
  # 「/ batch_size」までが上記の式に該当(左記の部分は使い勝手を良くするためのもの)
  # np.arangeでバッチサイズ分取り出して対数関数に与えている。
  # 「1e-7」は対数関数の結果が0になることを回避するために極めて小さい値を与えている。
  return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7) / batch_size

X. 래빗 챌린지란?



래빗 챌린지란, 일본 딥 러닝 협회 인정의 강좌 프로그램의 하나.
E 자격을 수험하기 위해서는 이 래빗 챌린지 등, 어느 하나의 강좌 프로그램을 수료해야 한다.

래빗 챌린지의 특징은 "현장에서 파괴가 효과가 있는 딥 러닝 강좌"의 통학 강좌 녹화 비디오를 편집한 교재를 사용한 자습 스타일이라는 점.
서포트는 다른 강좌보다 적고, 수신이 아니라 자주적으로 배워가는 자세가 아니면 진행되지 않지만, 그만큼, 다른 강좌에 비하면 저렴하고, 손이 내기 쉽다.
어느 정도 지식이 있는 사람, 자력으로 노력한다고 하는 녀석이 있는 사람 전용이 아닐까 느낀다.

좋은 웹페이지 즐겨찾기