DNN_1


1.深い学習の基本概念


入力値はであり、入力値xはweightと一致し、biasを加えてアクティブ化関数を生成する.
このとき、出力値が任意の数より大きい場合は1を出力し、任意の数より小さい場合は0を出力する.

2. XOR



y1 = s(-8) = 0, y2 = s(3) = 1, ŷ = s(-5)=0=======>XOR成立
Xのw,bの和をunit,perceptronと呼ぶ.
をニューラルネットワークと呼ぶ.
各演算を1つのベクトル→マトリクス形式にマージします.

3.学習深度ネットワーク連携


どのようにw,bを自動的に勉強させますか?
  • Back propagation(chain rule)
    f=wx+b,g=wx,f=g+bの場合
    wがfに及ぼす影響を理解するために,xがfに及ぼす影響,bがfに対するゼロ荷重を微分した.


    の後から、一歩一歩微分していきます.
    誤差を損失と呼び,逆伝搬損失微分によりネットワークを学習した.
    chain rule
    fはg+bなので、gを微分*w、gを微分
  • 4. Neural Net(NN) for XOR


    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    import tensorflow as tf
    tf.random.set_seed(777)  # for reproducibility
    
    
    x_data = [[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]]
    y_data = [[0],
              [1],
              [1],
              [0]]
    
    plt.scatter(x_data[0][0],x_data[0][1], c='red' , marker='^')
    plt.scatter(x_data[3][0],x_data[3][1], c='red' , marker='^')
    plt.scatter(x_data[1][0],x_data[1][1], c='blue' , marker='^')
    plt.scatter(x_data[2][0],x_data[2][1], c='blue' , marker='^')
    
    dataset = tf.data.Dataset.from_tensor_slices((x_data, y_data)).batch(len(x_data))
    def preprocess_data(features, labels):
      features = tf.cast(features, tf.float32)
      labels = tf.cast(labels, tf.float32)
      return features, labels
    
    #NN를 통해 XOR 해결
    W1 = tf.Variable(tf.random.normal((2,1)), name='weight1')
    b1 = tf.Variable(tf.random.normal((1,)), name = 'bias1')
    W2 = tf.Variable(tf.random.normal((2, 1)), name='weight2')
    b2 = tf.Variable(tf.random.normal((1,)), name='bias2')
    W3 = tf.Variable(tf.random.normal((2, 1)), name='weight3')
    b3 = tf.Variable(tf.random.normal((1,)), name='bias3')
    
    def neural_net(features):
      layer1 = tf.sigmoid(tf.matmul(features, W1) + b1)
      layer2 = tf.sigmoid(tf.matmul(features, W2) + b2)
      layer3 = tf.concat([layer1, layer2],-1)
      layer3 = tf.reshape(layer3, shape = [-1,2])
      hypothesis = tf.sigmoid(tf.matmul(layer3, W3) + b3)
      return hypothesis
    
    def loss_fn(hypothesis, labels):
      cost = -tf.reduce_mean(labels * tf.math.log(hypothesis) + (1 - labels) * tf.math.log(1 - hypothesis))
      return cost
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
    
    def accuracy_fn(hypothesis, labels):
        predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
        accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, labels), dtype=tf.float32))
        return accuracy
    
    def grad(hypothesis, features, labels):
        with tf.GradientTape() as tape:
            loss_value = loss_fn(neural_net(features),labels)
        return tape.gradient(loss_value, [W1, W2, W3, b1, b2, b3])
    
    EPOCHS = 50000
    
    for step in range(EPOCHS):
        for features, labels  in dataset:
            features, labels = preprocess_data(features, labels)
            grads = grad(neural_net(features), features, labels)
            optimizer.apply_gradients(grads_and_vars=zip(grads,[W1, W2, W3, b1, b2, b3]))
            if step % 5000 == 0:
                print("Iter: {}, Loss: {:.4f}".format(step, loss_fn(neural_net(features),labels)))
    x_data, y_data = preprocess_data(x_data, y_data)
    test_acc = accuracy_fn(neural_net(x_data),y_data)
    print("Testset Accuracy: {:.4f}".format(test_acc))

    5. ReLU


    f(x)=max(0,x):x値が0より大きい場合はxを抽出し、0より小さい場合は0を抽出する
    消失勾配:勾配が消失、すなわち0に近づき、ネットワークが伝送できない