深さ学習基礎0325 Fri

25822 ワード

preview


  • パラメータ論:入力値に重み付けを乗算した後、結果が0より大きい場合は1を返します.そうでない場合は0を出力し、次のレベルに値を移動します.
    すなわち,重み付けとステップ関数=>ステップ関数を順番に実行することでPerceptronがアクティブであるか否かが決まるので,ステップ関数をアクティブ関数と呼ぶ.

  • 信号:ニューラルネットワークでよく使われるアクティブ化関数.ステップ関数とは異なり、S字形曲線形式の連続関数です.

  • ステップ関数と信号の違いは、0を基準として入力値が0より大きい場合は1、0より小さい場合は0を出力し、ギャップ値を表すことができないステップ関数が異なり、信号は滑らかなステップ関数形状であり、値を連続的に表すことができる.

  • 線形vs非線形関数
    リニアリニアリニア:入力定数倍になる関数を出力する
    f(x)=ax+b(aとbは定数)
    非線形ひせんけい:非線形関数ひせんけいかんすう
    ニューラルネットワークにおける非線形関数=>人工ニューラルネットワーク刺激値を活性化する活性化関数は線形関数ではない.
  • どういう意味でしょうか、
    h(x)=線形関数、例えばcxを使用する場合.
    これは,層がどんなに深くても最終的には線形になることを意味する.
    なんとも言えませんが、
    例えば、h(x)からなるニューラルネットワークが100層堆積したと仮定する.
    でもc(c(x))...このようにして戻り値をパラメータとして使用し、戻り値をパラメータとして使用するには、100回繰り返すだけです.
    これは単純なa=(c^100)*xにすぎず,最終的に多層を積み重ねても第1層と変わらない.

  • ReLU関数
    入力が0より大きいと通過し、入力が0より小さいと出力0になります.

  • 多次元配列の計算
    Numpiを用いた多次元配列計算=>ニューラルネットワークを効率的に実装
  • import numpy as np
    
    A = np.array([[1,2],[3,4]])
    print(A.shape)  # 행렬 구조(?행?열)
    
    B = np.array([[5,6],[7,8]])
    print(B.shape)
    
    print(np.dot(A, B)) # 행렬의 곱
    
    # 2 x 3 행렬와 3 x 2 행렬의 곱 계산
    C = np.array([[1,2,3],[4,5,6]])
    print(C.shape)
    D = np.array([[1,2],[3,4],[5,6]])
    print(D.shape)
    
    print(np.dot(C, D))
    
    # 다음 코드의 문제점은?
    print(C.shape)
    
    E = np.array([[1,2],[3,4]])
    print(E.shape)
    
    print(np.dot(C, E))
    
    # 2 x 3 행렬과 2 x 2 행렬의 곱 계산으로 오류 발생 => 행렬의 곱에서 서로 대응하는 차원의 수를 일치시켜야.
    

    ニューラルネットワークにおけるマトリクスの積



    さんそうニューラルネットワーク
  • 入力層(0層)-2ノード
  • 最初の非表示レイヤ(1レイヤ)-3ノード
  • 第2の非表示層(2層)-2ノード
  • 出力層(3層)-2ノード
  • マーキングほう

    0層->1層信号伝達
    # a1 노드 계산의 파이썬 구현
    X = np.array([1.0, 0.5])
    W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
    B1 = np.array([0.1, 0.2, 0.3])
    
    print(W1.shape)
    print(X.shape)
    print(B1.shape)
    
    A1 = np.dot(X, W1)+B1
    print(A1)
    
    def sigmoid(x):
        return 1 / (1 + math.e ** -x)
        
    Z1 = sigmoid(A1) # 활성화함수
    print(Z1)
    第1層->第2層信号伝達
    # 1층 => 2층 신호전달 구현
    W2 = np.array([[0.1, 0.4],[0.2, 0.5],[0.3, 0.6]])
    B2 = np.array([0.1, 0.2])
    
    print(Z1.shape) # (3, )
    print(W2.shape) # (3, 2)
    print(B2.shape) # (2, )
    
    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid(A2)
    レイヤ2->出力レイヤ信号伝達
    出力レイヤは、他の関数を使用せずに、自分の値を直接出力します.
    # 2층 => 출력층 신호전달 구현
    def idenity_function(x):
      return x
    
    W3 = np.array([[0.1, 0.3],[0.2, 0.4]])
    B3 = np.array([0.1, 0.2])
    
    A3 = np.dot(Z2, W3) + B3
    Y = idenity_function(A3) # or Y = A3 도 같은 결과
    print(Y) # 결과: [0.31682708 0.69627909]
    最終コード
    # 3층 신경망 구현 정리
    
    import numpy as np
    
    # 시그모이드 함수 구현
    def sigmoid(x):
      return 1/(1+np.exp(-x)) 
    
    # 항등 함수 구현(입력을 그대로 출력)
    def identify_function(x):
      return x 
    
    # 가중치, 편향을 초기화 하고 network에 저장
    # 딕셔너리 변수인 network에는 각 층에 필요한 매개변수(가중치와 편향) 저장
    
    def init_network():
      network = {}
      network['W1'] = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]]) # 0->1 가중치
      network['b1'] = np.array([0.1, 0.2, 0.3]) # 0->1 편향
      network['W2'] = np.array([[0.1, 0.4],[0.2 ,0.5], [0.3, 0.6]]) # 1->2 가중치
      network['b2'] = np.array([0.1, 0.2]) # 1->2 편향
      network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]]) # 2->3 가중치
      network['b3'] = np.array([0.1, 0.2]) # 2->3 편향
    
      return network
    
    def forward(network, x): # 신호: 순방향(입력->출력)
      W1, W2, W3 = network['W1'], network['W2'], network['W3']
      b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
      a1 = np.dot(x, W1) + b1 # 0->1 가중치 계산
      z1 = sigmoid(a1) # 0->1 활성화
      a2 = np.dot(z1, W2) + b2 # 1->2 가중치 계산
      z2 = sigmoid(a2) # 1->2 활성화
      a3 = np.dot(z2, W3) + b3 # 2->3 가중치 계산
      y = identify_function(a3) # 2->3 활성화
    
      return y
    
    network = init_network()
    x = np.array([1.0, 0.5]) # 입력값
    y = forward(network, x) # 출력값
    print(y) # [0.31682708 0.69627909]