Hands-on ML Ch 10: Neural Network


乗算、演算を実行する人工ニューロンの出現.

Perceptron


入力と出力は数値で、各入力接続はウェイトに関連しています.
重み付け和を計算しstep関数を適用して結果を出力します.
hw(x)=step(z),z=XTwh_w(x) = step(z), z = X^Twhw​(x)=step(z),z=XTw
各TLU(しきい値論理ユニット)が全ての入力層に接続されている場合、全接続層と称される.(またはレスポンス層)
1つのサンプリングポイントが1つのサンプリングポイントに一度に注入されると、各サンプリングポイントに対して予測が生成され、入力に関連する重み値が増強され、すべての予測エラーの出力ニューロンを正確に予測する.

Multi-layer Perceptron


Input Layer-Hidden Layer-Output Layerの構造.すべてのフロアが次の階と完全につながっています.
  • 転送経路は、各層が前の層の出力を計算し、次の層に転送する.Backpropの中間計算値を保存します.
  • BackPropagationは、最終予測値に対する各出力接続の誤差寄与を計算する.各重みの誤差勾配を測定する過程.
  • 最後に勾配降下法により重みを調整する、この誤差
  • を低減する.
    Step関数をsigmoid関数に変更して勾配を計算します.
    from tensorflow import keras
    import tensorflow as tf
    model = keras.models.Sequential()
    # 입력 이미지를 1d array 로 변환. 모델의 첫번째 층에 해당함.
    model.add(kears.layers.Flatten(input_shape = [28, 28]))
    # 뉴런 300개 짜리 hidden layer
    model.add(keras.layers.Dense(300, activation = "relu"))
    model.add(keras.layers.Dense(100, activation = "relu"))
    # 뉴런 10개 짜리 hidden layer. Independent class 결과를 위해 softmax 함수 사용
    model.add(keras.layers.Dense(10, activation = "softmax"))
    # 만약에 one-hot vector 일 경우에는 그냥 "categorical_crossentropy"를 사용
    model.compile(loss = "sparse_categorical_crossentropy",
    							optimizer = "sgd",
    							metrics = ["accuracy"])

    Wide and Deep Model


    skip接続の形式

    keras.シーケンスインスタンスではなくクラスインスタンスとして作成することもできます.
    class WideandDeepModel(keras.Model):
    	def __init__(self, units = 30, activation = "relu", **kwargs):
    		super().__init__(**kwargs)
    		self.hidden1 = keras.layers.Dense(units, activation = activation)
    		self.hidden2 = keras.layers.Dense(units, activation = activation)
    		self.main_output = keras.layers.Dense(1)
    		self.aux_output = keras.layers.Dense(1)
    
    	def call(self, inputs):
    		input_A, input_B = inputs
    		hidden1 = self.hidden1(input_B)
    		hidden2 = self.hidden2(hidden1)
    		concat = keras.layers.concatenate([input_A, hidden2])
    		main_output = self.main_output(concat)
    		aux_output = self.aux_output(hidden2)
    		return main_output, aux_output
    
    model = WideandDeepModel()

    Hyperparameter Tuning


    たとえば、回帰モデルを作成するときにscikit-learningが提供するランダム検索方法を使用してnum of layersやlearning rateなどを検索できます.
    # 먼저 model 을 구성하는 함수를 정의
    def build_model(n_hidden = 1, n_neurons = 30, lr = 3e-3, input_shape = [8]):
    	model = keras.models.Sequential()
    	model.add(keras.layers.InputLayer(input_shape = input_shape)
    	for layer in range(n_hidden):
    		model.add(keras.layers.Dense(n_neurons, activation = "relu")
    	model.add(keras.layers.Dense(1))
    	optimizer = keras.optimizers.SGD(lr = lr)
    	model.compile(loss = "mse", optimizer = optimizer)
    	return model
    
    # regression model 생성
    keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
    
    # Random Search 진행하기
    from scipy.stats import reciprocal
    from sklearn.model_selection import RandomizedSearchCV
    
    params = {
    	"n_hiddens": [0, 1, 2, 3],
    	"lr" = reciprocal(3e-4, 3e-2)
    }
    
    randomsrch = RandomizedSearchCV(keras_reg, prams, n_iter = 10, cv = 3)
    randomsrch.fit(X_train, y_train, epochs = 100,
    	validation_data = (X_valid, y_valid), # cv 에는 사용하지 않으나 patience 측정에 사용
    	callbacks = [keras.callbacks.EarlyStopping(patience = 30)]
    )
    print(randomsrch.best_params_)
    final_model = randomsrch.best_estimator_.model

    Transfer Learning


    一般的に、隠層学習は次のようになります.
  • 下層は低層構造モデリング
  • である.
  • 中間層はより低いレベルの構造を接続し、中レベルの構造モデリング
  • である.
  • の最上位の非表示レイヤと出力レイヤは、高度な構造モデリング
  • のために中間レイヤを接続する.
    新しいニューラルネットワークでは,最初の層の重みと偏向値をtransfer learningの原理に初期化するのではなく,最初の層の重みと偏向値を整数に初期化した.
    この方法はほとんどの画像における低レベル構造を学習する必要はない.