第11章.深層ニューラルネットワークを訓練する


深層ニューラルネットワーク学習で発生する可能性のある問題とその解決策
📌 トレーニングのスピードを上げる方法
1.適切な接続ウェイトを使用した初期化ポリシー
2.正常なアクティブ化関数の使用
3.正規化配置の使用
4.予め訓練されたネットワークの一部を再利用する

1.グラデーションの消失と暴走


1-1. 漸変的消失と飲酒問題

  • グラデーションが消失:グラデーションがますます低くなると
  • グラデーションが激しくなる:グラデーションが低ければ低いほど、グラデーションが大きくなり、異常に重み付け
  • をリフレッシュする
    ex)ポインティングレバー活性化関数
    正または負の値を入力すると0 or 1に収束し、傾きは0に近い.
    👉🏻 ニューラルネットワークが上向きに増大するにつれて,最上層では活性化関数が0または1に収束し,伝搬可能なグラデーションはほとんどなく,実際には下層では何も達成できなかった.

    1-2. 解決策1)globatとheの初期化


    ✔ファン-in:レイヤーの入力接続数
    ≪表計算ドキュメント|Enter Enter|Essbase_Studio≫:≪レイヤーの出力接続|Output Connections|Essbase_Studio≫
    グラートの初期化(=セビの初期化)
    ランダム初期化
  • 各層の接続重み付け値
  • 層の傾斜分散間でバランスをとり、特定層の目立ちすぎを防止する.
  • 訓練速度上昇
  • S字型アクティブ化関数(로지스틱, 소프트맥스)と併用すると、性能が良い(RELUと併用すると、性能が悪い)
  • HE初期化
  • ReLUアクティブ化関数の初期化

    📌 グラッド初期化:論理棒、破線接線、ソフトMaxアクティブ化関数とともに使用
    📌 HE初期化:Relu関数とRelu関数の変種
  • # 글로럿 초기화
    keras.layers.Dense(10, activation='relu', kernel_initializer='he_uniform')
    
    # He초기화
    keras.layers.Dense(10, activation='relu', kernel_initializer='he_normal')
    
    # fan_avg 기반 균등 분포 He 초기화
    he_avg_init = keras.initializers.VarianceScaling(scale=2., \
    						 mode='fan_avg', \
    						 distribution='uniform')
    keras.layers.Dense(10, activation='sigmoid',\
    		   
               kernel_initializer=he_avg_init)

    1-3. 解決策2)収束しない活性化関数


    ReLU関数:特定の正の値に収束しない(利点)
    しかし、死んだRELUの問題が発生する可能性があります(訓練中、一部のニューロンはゼロではない値Xを出力します)
    ReLU関数のバリエーション
  • LeakyReLU
    通常、関数の傾き(alpha)は0.01に設定され、
  • は死なないようにする.
    model = keras,models.Sequential([
    	[...]
        	keras.layers.Dense(10, kernel_initializer='he_normal'),
        	keras.layers.LeakyReLU(alpha=0.2)
        	[...]
    ])
  • RReLU
    ランダムにalphaを選択し、テスト時に平均的に法規として使用する
  • PReLU
    Alphaはトレーニング中に学習(But、小型データセット、トレーニングセットにフィットするリスクがある)
  • model = keras,models.Sequential([
    	[...]
        	keras.layers.Dense(10, kernel_initializer='he_normal'),
        	keras.layers.PReLU()
        	[...]
    ])
  • ELU
    入力がゼロ以下(RELUと同様)の場合、スムーストリムによる平均出力はゼロに近い
  • SELU
    ERUアクティブ書画関数の変種
    すべての非表示レイヤでSELUを使用すると、ネットワークは自己正規化されます.
    ネットワークは、ワイドスクリーンや奥行きなどのスキップ接続を使用したレイヤで構成されています.
    訓練時の各層出力は平均0,標準偏差は
  • であった.
    layers = keras.layers.Dense(10, activation='selu',
        			    kernel_initializer='lecun_normal')
    👉🏻一般的には심층 신경망의 은닉층です.
    SELU > ELU > LeakyReLU > ReLU > tanh < Logistic

    1-4. 解決方法3)正規化配置

    배치 단위로 정규화 하는 것
    👉🏻入力値が同じであっても、重みが変化するとまったく異なる値になるため、layerにレイアウト正規化プロセスを追加し、重みの違いを緩和し、学習をより安定させます.
    バッチ正規化アルゴリズム
  • 深部ネットワーク(多重隠蔽層のニューラルネットワーク)は主に
  • を用いる.
  • 隠層のアクティブ化関数の入出力値に演算を追加
  • 配置の平均値は0であり、標準化分布は1
  • である.
  • 標準化後、配置データをgamma、betaを介して新しい値
  • に変換する
  • gamma,beta各層ニューロン1個
  • 스케일 조정 -gamma & beta, 이동 평균 -moving_mean, moving_variance
  • テストフェーズ
  • は、平均および分散のミニ配置を計算していないので、
  • を使用してトレーニングデータ全体の平均および分散を計算する.
    🖥 ケラスを使用した標準化された導入
    model = keras.models.Sequential([
    	keras.layers.Flatten(input_shape=[28,28]),
        	keras.layers.BatchNormalization(),
        	kears.layers.Dense(300, activation='elu', 
        		       	   kernel_initializer='he_normal'),
        	keras.layers.BatchNormalization(),
            kears.layers.Dense(100, activation='elu', 
        		       	   kernel_initializer='he_normal'),
            keras.layers.BatchNormalization(),
            kears.layers.Dense(10, activation='softmax'
    ])

    2.転独学及び非指導の事前訓練


    2-1. 転校学習

  • 類似のタイプの問題を処理するニューラルネットワークの下層を繰り返し使用する学習方法
  • の訓練速度を向上させ、訓練データ量
  • を減少させることができる.
    ✔¥¥АААААААААА\1040
  • モデルA:Fashion MNISTの高性能モデル
  • TODO->サンダルとシャツを区別するバイナリ分類器Bを作る
    1)型番A 로드2)モデルA의 층을 재사용により新規モデルを作成する(出力層以外の全ての層を再利用する)
    3)B型訓練時にA型に影響するため、クローンA型가중치를 복사4)訓練されていないモデルBの出力層はランダムに初期化されるので、재사용된 모델 A의 층들은 동결及び새로운 출력층은 학습の時間が与えられる
    5)訓練
    6)再使用層凍結解除(この場合、学習率の低下を推奨)後の訓練
  • 🖥 kerasによる移行学習
    model_A = keras.models.laod_model('model_A.h5')
    # 모델 B에 model_A의 layer들 재사용
    new_model_B = keras.models.Sequential(model_A.layers[:-1])
    # 모델 B에 출력층 생성
    new_model_B.add(keras.layers.Dense(1, activation='sigmoid'))
    
    # model_A의 가중치 복사
    model_A_clone = keras.models.clone_model(model_A)
    model_A_clone.set_weights(model_A.get_weights())
    
    # 동결 후 compile
    for layer in new_model_B.layers[:-1]:
    	layer.trainable = False
    new_model_B.compile(loss='binary_crossentropy',
    		    optimizer='sgd',
                	    metrics=['accuracy'])
                        
    # 학습
    history = nes_model_B.fit(X_train_B, y_train_B, epochs=4, 
    			  validation_data=(X_valid_B, y_valid_B))
    
    for layer in new_model_B.layers[:-1]:
    	layer.trainable = True
       
    # 동결 해제 후 compile
    optimizer = keras.optimizer.SGD(lr=1e-4) # 기본 학습률:1e-2
    new_model_B.compile(loss='binary_crossentropy',
    		    optimizer=optimizer,
              	    metrics=['accuracy'])
    
    # 학습
    history = new_model_B.fit(X_train_B, y_train_B, epochs=16, 
    			  validation_data=(X_valid_B, y_valid_B))

    2-2. 非指導的訓練

  • ラベルが少ない場合、複雑な問題を処理するために使用されます.
  • は、一般に、1回の非指導学習モードトレーニングの後に、自動エンコーダまたはGAN
  • を使用する.

    3.最適化方法


    大規模なモデルのトレーニングを高速化

    3-1. アニメーションの最適化

  • 以前のグラデーション値はどれくらい重要ですか
  • グラデーションで加速
    (betaスーパーパラメータを用いて運動量が大きすぎることを防止する)
  • の典型的な基準値は0.9
  • である.
    optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9)

    3-2. ネストロフ加速傾斜

  • 動機最適化変種、訓練速度は基本動機最適化より
  • 速い
  • が元の位置よりも近い方向に測定するグラデーション量
  • を計算する.
    optimizer = keras.optimizer.SGD(lr=0.001 momentum=0.9, nesterov=True)

    3-3. AdaGrad

  • 学習率値の調整
  • 最も急な面に沿ってグラデーションベクトルのスケーリングを減少する
  • 、すなわち学習率を減らす(学習率が小さすぎると長い学習時間がかかる&学習率が大きすぎると問題を解決する必要がある)
  • 深層ニューラルネットワークにおけるX
  • の使用

    3-4. Adam

  • ベンチマーク最適化+RMSProp
  • (基準)前のランプ指数平均減少(RMSProp)前のランプ二乗指数平均減少
  • 学習率は超パラメータ調整X
  • が必要である.
    optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)

    3-5. 学習率の設定

  • 戦略
  • 성능 기반 스케줄링(ReducelronPlateauコールバック)
  • を表します.
    lr_scheduler = keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)
  • 性能計画に基づいてvalid lossが5期間で減少しなかった場合、学習率に0.5
  • を乗じる

    4.規制手法


    使用制限は大きすぎることを避けることができます.
  • 早期終了、配置正規化
  • ニューラルネットワークで広く用いられている制御方法(l 1&l 2,dropo,...)
  • 4-1. l 1&l 2制限


    l 1制限
  • 疎モデルを作成するための
  • l 2制限
  • ニューラルネットワーク接続重み付け制限
  • 🖥 partialのl 2制限の使用
    from functools import partial
    RegularizedDense = partial(keras.layers.Dense,
    			   activation='elu',
                   		   kernel_initializer='he_normal',
                           	   kernel_regularizer=keras.regularizers.l2(0.01))
    
    model = keras.models.Sequeuntial([
        keras.layers.Flatten(input_shape=[28,28]),
        RegularizedDense(300),
        RegularizedDense(100),
        RegularizedDense(10, activation='softmax', 
        		     kernel_initializer='glorot_uniform')
    ])
  • partial:すべての非表示レイヤが同じパラメータ値を繰り返す場合、コード再作成方法
  • 4-2. ドロップ

  • 深層ニューラルネットワークで最も人気のある制御技術
  • 入力値の微小な変化はあまり敏感ではない(隣接するニューロンに依存しない)ため、制御戦略
  • が採用される.
  • 各トレーニングステップにおいて、임시적の確率pが10%から50%の間である
  • に各ニューロンホイールを下方に配置することを指定する.
  • 訓練終了後、ニューレンエにハンマーX
  • を適用
    2479172モデルが誇張された場合、滴出率は¥¥2であった.
    モデルが小さすぎると,滴下率はであった.
    model = keras.models.Sequential([
        keras.layers.Flatten(input_shape=[28,28]),
        keras.layers.Dropout(0.2),
        keras.layers.Dense(300, activation='elu', 
        			kernel_initializer='he_normal'),
        keras.layers.Dropout(0.2),
        keras.layers.Dense(100, activation='elu', 
        			kernel_initializer='he_normal'),
        keras.layers.Dropout(rate=0.2),
        keras.layers.Dense(10, activation='softmax')
    ])