當今人工智能主流方向 —— 連接主義,即仿腦神經元連接,實現感性思維,如神經網絡。
神經網絡的一般設計過程:
- 准備數據:采集大量“特征/標簽”數據
- 搭建網絡:搭建神經網絡結構
- 優化參數:訓練網絡獲取最佳參數(反向傳播)
- 應用網絡:將網絡保存為模型,輸入新數據,輸出分類或預測結果(前向傳播)
前向傳播
y = x * w + b,輸入x,計算出y的過程叫做前向傳播
損失函數:可預測值(y)與標准答案(y_)的差距,定量判斷w、b的優劣。
當損失函數輸出最小時,參數w、b會出現最優值。
均方誤差是一種常用的損失函數。
梯度下降
目的:找到一組w、b,使得損失函數最小。
梯度:損失函數對各參數求偏導后的向量。損失函數梯度下降的方向,就是損失函數減小的方向。
梯度下降法:沿損失函數梯度下降的方向,尋找損失函數的最小值,得到最優參數的方法。
學習率 lr:梯度下降的速度。
學習率過小,參數更新會很慢;
學習率過大,參數更新會跳過最小值。
反向傳播
首先設置反向傳播迭代次數,在每次迭代中,根據下圖公式,迭代更新所有參數。
反向傳播(使用梯度下降法,使損失函數最小)
代碼示例:
import tensorflow as tf # w的初始值為5,設置為可訓練
w = tf.Variable(tf.constant(5, dtype=tf.float32)) # 學習率為0.2
lr = 0.2
# 數據集喂入神經網絡30次
epoch = 30
# 數據集級別的循環,每個epoch循環一次數據集
for epoch in range(epoch): # 使用with結構定義loss函數,gradient函數告知誰對誰求導
with tf.GradientTape() as tape: # 損失函數定義為(w+1)^2
loss = tf.square(w + 1) grads = tape.gradient(loss, w) # assign_sub函數:變量自減,即:w -= lr*grads
w.assign_sub(lr * grads) print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss)) # 最終結果:損失函數最小值為 loss = 0.0,最優參數為 w = -1
輸出結果: