Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update normalization.md(Fix words) #176

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 16 additions & 17 deletions sources/layers/normalization.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,29 @@
keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)
```

배치 정규화 레이어입니다. (Ioffe and Szegedy, 2014)
배치 정규화 층<sub>batch normalization layer</sub>입니다. (Ioffe and Szegedy, 2014)

배치에서 이전 레이어의 activations를 정규화합니다. 즉, activation의 평균은 0에 가깝도록 하고 표준 편차는 1에 가깝게 유지하는 변환을 적용합니다.
배치<sub>batch</sub>에서 이전 층<sub>layer</sub>의 activations를 정규화<sub>normalize</sub>합니다. 즉, activation의 평균은 0에 가깝도록 하고 표준편차는 1에 가깝게 유지하는 변환을 적용합니다.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 activations는 출력( 또는 출력값)으로 해도 될 것 같습니다. 아니면 보다 정확한 설명을 위해, '이전 층에서 출력한 배치'라고 쓰는 것도 생각해볼 수 있겠습니다. 계산이 배치단위로 이루어지기 때문이죠. 보충을 붙이자면 원래의 Batch Normalization은 Z = WX+ b를 가지고 산출한 Z' = (Z - mean(Z)/sd(Z)) 값을 이용, γZ' + β로 값들의 분포와 중심점을 조정한 뒤 activation function에 넣는 계산이라, 원래 이 층이 입력받아야 할 값은 activation이 적용되지 않은 값이어야 합니다. 케라스는 층이 모듈화되어있기 때문에 원래대로 Batch Normalization을 수행하려면 이전 레이어에서 activation을 None으로 지정하여 활성화되지 않은 출력값을 받은 후 BN을 적용하고, 그 값을 다시 Activation() 층에 넣는 식으로 수행해야 할 겁니다. 이 부분을 표현하기가 애매해서 원문을 쓸 때 그냥 이전 단계의 출력값이라는 표현을 activations라고 한 것 같습니다.

Copy link
Contributor Author

@fliklab fliklab Oct 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전 층의 (활성화 함수의 출력)을 다음 배치의 활성화함수에 입력하기 전, 정규화를 하고 나서 입력한다는 것으로 이해했는데, 설명하신 내용과 동일한 이해인지 모르겠습니다.

케라스 문서에 Activations라는 문서도 따로 있고 activation이라는 용어가 다른 문서에서도 유사한 문맥으로 쓰이는것 경우도 있는것 같아서, 원문 내용이 틀린게 아니라면 일관되게 번역하면 좋을것 같습니다. 다른 번역 사례를 찾아보니 Python Machine Learning(Sebastian Raschka 저) 을 박해선님이 번역한 글에서는 '활성화 출력'이라는 표현을 사용하고 있습니다. 이렇게 쓰는것도 괜찮아 보이는데, activation을 '활성화 출력'으로 쓰는것은 어떻게 생각하시나요?

(activation을 활성화로 직역하면 이상한 문장이 되기 때문에, 왜 이러한 단어를 쓰는지 이해가 안 되었는데 이유를 생각해보니, activation이 함수라고 한다면 그 이름이 곧 출력값을 의미하므로 activation(s)이라는 표현이 쓰이는 것 같습니다.)

'활성화 출력' 사용하여 다시 써본 문장입니다.

각 배치에서 이전 층layer의 활성화 출력을 정규화합니다. 즉, 평균은 0에 가깝도록 하고 표준편차는 1에 가깝게 유지하는 변환을 이전 층의 활성화 출력에 적용합니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'활성화'라는 표현이 조심스러운 이유는 (반드시 그러라는 법은 없지만) 보통 BatchNormalization은 활성화 함수에 넣기 전에 적용하기 때문입니다. 그러니까 활성화 하지 않은 값을 입력으로 받는 경우가 일반적이라는 거죠. 이유야, 활성화 함수에 넣어버리면 아무래도 값의 분포가 왜곡되기 때문이고요. 그래서 activations라고 쓴 원문도 사실 수정할 대상인 것이고, 그 표현을 그대로 번역하는 것도 피해야 하지 않겠는가라는 문제제기입니다. 레이어나 API 구조상 BN 적용 이전에 활성화함수 적용이 피하기 어려운 경우도 물론 있습니다. 예컨대 LSTM의 경우 활성화 함수 설정이 최종 출력값 외에 다른 내부 계산도 좌우하게 되어있기 때문에 활성화 함수를 함부로 없앨 수가 없습니다. 그런 경우는 activation된 값이 어쩔 수 없이 BN층에 입력되겠죠. 하지만 Dense라면 그 층에서는 activation=None으로 입력하고 BN으로 넘기는 게 맞습니다.


__인자 설명__

- __axis__: Integer, 정규화되어야 하는 축을 의미합니다.(일반적으로 feature axis입니다.) 예를 들어, `data_format="channels_first"`가 있는 `Conv2D`레이어 다음에 `axis=1`인 `BatchNormalization`을 설정할 수 있습니다.
- __momentum__: 이동 평균(moving mean) 및 이동 분산(moving variance)에 대한 모멘텀을 의미합니다.
- __epsilon__: 0으로 나누기를 방지하기 위해 분산에 추가되는 작은 float값 입니다.
- __center__: True일 경우, 정규화된 텐서에 `beta`만큼의 거리(offset)를 추가합니다. False인 경우 `beta`는 무시됩니다.
- __scale__: True일 경우, `gamma`를 곱합니다. False인 경우 `gamma`는 사용되지 않습니다. 다음 레이어가 선형(예를 들어, `nn.relu`)일때, Scaling이 다음 레이어에서 수행될 것이기 때문에 사용되지 않을 수 있습니다.
- __beta_initializer__: beta weight를 위한 초기값 설정기입니다.
- __gamma_initializer__: gamma weight를 위한 초기값 설정기입니다.
- __moving_mean_initializer__: 이동 평균(moving mean)을 위한 초기값 설정기입니다.
- __moving_variance_initializer__: 이동 분산(moving variance)을 위한 초기값 설정기입니다.
- __beta_regularizer__: beta weight를 위해 선택적으로 사용 가능한 규제기입니다.
- __gamma_regularizer__: gamma weight를 위해 선택적으로 사용 가능한 규제기입니다.
- __beta_constraint__: beta weight를 위해 선택적으로 적용 가능한 제약조건입니다.
- __gamma_constraint__: gamma weight를 위해 선택적으로 적용 가능한 제약조건입니다.
- __axis__: `int`, 정규화되어야 하는 축을 의미합니다.(일반적으로 요인 축<sub>feature axis</sub>입니다.) 예를 들어, `data_format="channels_first"`가 있는 `Conv2D`층의 다음에 `axis=1`인 `BatchNormalization`을 설정할 수 있습니다.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명을 조금 덧붙이면 좋을 것 같습니다. -> 예를 들어, 행과 열, 채널 가운데 채널이 가장 앞에 오도록 설정된(data_format="channels_first") Conv2D레이어의 다음에 BatchNormalization을 덧붙일 경우 정상적으로 요인 축을 정규화하도록 axis=1로 설정합니다.

- __momentum__: 이동 평균<sub>moving mean</sub> 및 이동 분산<sub>moving variance</sub>에 대한 모멘텀을 의미합니다.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명을 조금 덧붙이면 좋을 것 같습니다. -> 정규화 과정에서 평균을 구할 때 이전 배치들도 참고하도록 이동 평균moving mean과 이동 분산moving variance을 적용합니다. momentum인자는 이때 얼마나 먼 시점의 배치까지 참고할지 결정하는 인자입니다. 01사이의 float값을 입력받으며 기본값은 0.99입니다. 값이 클 수록 더 많은 이전 배치를 참고합니다.

- __epsilon__: 0으로 나누기를 방지하기 위해 분산에 추가되는 작은 `float`값 입니다.
- __center__: `True`일 경우, 정규화된 텐서에 `beta`만큼의 거리(offset)를 추가합니다. `False`인 경우 `beta`는 무시됩니다.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명을 덧붙이면 좋겠습니다.
거리(offset)를 추가합니다. -> 거리offset를 추가하여 분포의 중심점을 조정합니다.

- __scale__: `True`일 경우, `gamma`를 곱합니다. `False`인 경우 `gamma`는 사용되지 않습니다. 다음 층이 선형일 때(예: `nn.relu`), Scaling이 다음 층에서 수행될 것이기 때문에 사용되지 않을 수 있습니다.
Copy link
Contributor

@EthanJYK EthanJYK Oct 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명을 바꾸면 좋겠습니다. 실제로 백엔드의 relu 함수는 scaling기능이 없습니다. relu의 그 다음 층에서 scaling을 한다면 모를까 말이죠. 뜻 자체가 애매하기 때문에 이건 설명을 달리 하는 게 맞을 것같습니다. 또한 케라스는 백엔드가 여럿이므로 ReLU는 굳이 tf의 nn.relu일 필요가 없습니다. 그냥 ReLU여도 될 것 같습니다.

True일 경우, gamma를 곱하여 출력할 값의 폭을 조정합니다. 다음 층이 ReLU와 같은 선형 활성화 층이라서 입력값 분포의 중심점에 비해 폭은 덜 중요한 경우 False를 입력하여 생략할 수 있습니다.

Copy link
Contributor

@EthanJYK EthanJYK Oct 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아니면, "다음 층이 ReLU와 같은 선형 활성화인 경우 그 이후의 층에서 조정되기 때문에 False를 입력하여 생략할 수 있습니다."로 하는 편이 더 간략할 수 있겠네요.

Copy link
Contributor Author

@fliklab fliklab Oct 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argument의 작동을 설명하는 문장이 먼저 나온 뒤에 부연 설명(이유, 원리, 예시 등)이 따라오는게 적절할 것 같은데 부연설명 이전에 False에 대한 설명이 먼저 나오는게 어떨까요. (Tutorial이 아니라 Document라는 점을 고려함)

Scale, scaling이라는 용어가 다른 책/자료에서도 사용되긴 해서 완전히 제외하는게 맞을지 고려하고 싶은데 어렵네요. 일단 원문에서도 relu 함수에 scaling 기능이 있다는 뜻은 아닌것 같습니다.

scaling을 뺀 경우 다시 번역해 본 문장입니다.

True일 경우, gamma를 곱하여 출력할 값의 폭을 조정합니다. False이면 gamma 값은 무시됩니다. 다음 층이 ReLU와 같은 선형 활성화인 경우 그 이후의 층에서 조정되기 때문에 False를 입력하여 생략할 수 있습니다.

Copy link
Contributor

@EthanJYK EthanJYK Oct 20, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

괜찮은 것 같습니다. 한가지 더 걸리는 게 있다면, ReLU는 부분적으로는 선형이지만 실제로는 선형함수가 아닌데 원문에서부터 선형 활성화라고 쓰였다는 겁니다. ReLU를 분류하면 분명히 Non-linear에 들어갑니다. 이건 어떻게든 수정하고 원문 PR 날릴 수도 있는 내용이네요.

- __beta_initializer__: beta 가중치를 위한 초기화 함수<sub>initializer</sub>입니다.
- __gamma_initializer__: gamma 가중치를 위한 초기화 함수입니다.
- __moving_mean_initializer__: 이동 평균<sub>moving mean</sub>을 위한 초기화 함수입니다.
- __moving_variance_initializer__: 이동 분산<sub>moving variance</sub>을 위한 초기화 함수입니다.
- __beta_regularizer__: beta 가중치를 위해 선택적으로 사용 가능한 규제 함수<sub>regularizer</sub>입니다.
- __gamma_regularizer__: gamma 가중치를 위해 선택적으로 사용 가능한 규제 함수입니다.
- __beta_constraint__: beta 가중치를 위해 선택적으로 적용 가능한 제약입니다.
- __gamma_constraint__: gamma 가중치를 위해 선택적으로 적용 가능한 제약입니다.

__입력 크기__

임의입니다. 이 레이어를 모델의 첫 번째 레이어로 사용할 때, 키워드 인자 `input_shape` (정수 튜플, 샘플 축 미포함)를 사용하십시오.
임의입니다. 이 층을 모델의 첫 번째 층으로 사용할 때, 키워드 인자 `input_shape` (정수 튜플, 샘플 축 미포함)를 사용하십시오.

__출력 크기__

Expand All @@ -37,4 +37,3 @@ __참고 자료__

- [Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift](https://arxiv.org/abs/1502.03167)