Open givitallugot opened 1 year ago
글로럿과 벤지오가 제안한 불안정한 그레이디언트 문제 완화 방법
양방향 신호가 적절하게 흐르게 하기 위해 아래 두가지를 지켜야 함
각 층의 출력에 대한 분산이 입력에 대한 분산과 같아야 한다
역방향에서 층을 통과하기 전과 후의 그레이디언트 분산이 동일해야 한다
층의 입력과 출력 연결 개수 (팬-인 & 팬-아웃) 가 같지 않다면 이 두 가지를 보장할 수 없으나,
아래의 세이비어 초기화 (글로럿 초기화) 방법이 실전에서 매우 잘 작동한다고 입증됨
각 층의 연결 가중치를 아래 식에 기술한 방식대로 무작위로 초기화 (fanavg = (fanin + fanout)/2)
르쿤 초기화: 글로럿 초기화의 식에서 fanavg를 fanin로 바꾼 것
fanin = fanavg이면 르쿤 초기화는 글로럿 초기화와 동일
글로럿 초기화를 사용하면 훈련 속도를 상당히 높일 수 있음
다른 활성화 함수에 대해 제안된 비슷한 전략들
케라스는 기본적으로 균등분포의 글로럿 초기화를 사용
keras.layers.Dense(10, activation="relu", kernel_initializer="he_normal")
he_avg_init = keras.initializers.VarianceScaling(scale=2., mode='fan_avg', distribution='uniform')
keras.layers.Dense(10, activation="sigmoid", kernel_initializer=he_avg_init)
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.BatchNormalization(),
keras.layers.Dense(300, activation="relu"),
keras.layers.BatchNormalization(),
keras.layers.Dense(100, activation="relu"),
keras.layers.BatchNormalization(),
keras.layers.Dense(10, activation="softmax")
])
RELU
LeakyReLU
RReLU
: randomized leaky ReLU
PReLU
: parametric leaky ReLU
ELU
: exponential linear unit (2015)
SELU
: Scaled ELU (2017)
model = keras.models.Sequential([ ... keras.layers.Dense(10, kernel_initializer="he_normal"), keras.layers.LeakyReLU(alpha=0.2) ... ])
keras.layers.PReLU()
keras.layers.Dense(10, activation="selu", kernel_initializer="lecun_normal")
~1/6 (금) 10시 30분~ 1/11 (수) pm 9:00