Machine Learning
227郭彥聖
yennnn
建中資訊 外交長
想學習機器學習所以才來教機器學習
FB:郭彥聖
每週四18:00~19:00
段考週、段考前一週停課
線上Google Meet
電教二
自由參加,不須請假
歡迎提問討論
中文授課,但專有名詞會用英文
以理論為主,實作為輔
Keras
日期 | 課程內容 |
---|---|
3/10 | 課程介紹、AI初探、先備知識 |
4/7 | 神經元、激勵函數、類神經網路 |
4/14 | 損失函數、梯度下降、反向傳播 |
4/21 | 過適、卷積神經網路 |
4/28 | 卷積神經網路實作 |
日期 | 課程內容 |
---|---|
5/26 | 遞迴神經網路 |
6/2 | 遞迴神經網路實作 |
6/9 | 遞迴神經網路實作 |
6/16 | 生成對抗網路、Transformer |
*實際課程依進度滾動調整
Python語法
物件導向概念
看函式庫文件
國中數學
國中英文
矩陣與線性代數
微分與偏微分
認識神經網路
Artificial Intelligent
人工智慧
人類製造出來的機器所展現的智慧
機器能模仿人類感知、思考、決策、學習的能力
強人工智慧
就像是一個人類一樣
能做到人類可以做到的所有事情
弱人工智慧
機器學習
一種實現人工智慧的方法
利用大量資料訓練,讓機器學會某項技能
送機器去補習班
廢物機器
有用機器
資料
氣溫、濕度
風速、雨量
熱食部營業額
新增病例數
隔天是否下雨
ML演算法
支持向量機
迴歸模型
類神經網路
判斷隔天會不會下雨
機器學習開發環境
矩陣的運算
微分與偏微分的概念
2015年發布
Google 開發
穩定性較佳
業界普遍使用
語法較艱澀
建立於tensorflow框架上
簡化語法
kernel = tf.Variable(tf.truncated_normal([3, 3, 64, 64], type=tf.float32, stddev=1e-1), name='weights')
conv = tf.nn.conv2d(self.conv1_1, kernel, [1, 1, 1, 1], padding='SAME')
biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name='biases')
out = tf.nn.bias_add(conv, biases)
self.conv1_2 = tf.nn.relu(out, name='block1_conv2')
x = Convolution2D(64, 3, 3, activation='relu', border_mode='same', name='block1_conv2')(x)
2016年發布
Facebook 開發
學術界愛用
語法較簡單
線上
本機
線上 | 本機 |
---|---|
不用安裝 | 安裝麻煩 |
不吃本地資源 | 占用本機資源 |
依賴網路 | 可離線開發 |
設定自由度低 | 設定自由度高 |
嗯嗯 聽起來非常麻煩是吧?
\( 2 \times 3 階矩陣 \)
\( 3 階方陣 \)
解方程組
算機率
算幾何
算物理
簡化表達方式
矩陣常常代表一種轉移關係
\(若A 為 m \times n階、B為k \times p階 \)
\(矩陣可乘若且唯若 n = k\)
\( 乘完會變 m \times p階 \)
直線的傾斜程度
代表B很靠近A時的斜率
\(稱為f(x) 在 x = a時的導數\)
\(記作f'(a)\)
\(把f(x)在每一個點的導數收集起來變成一個函數\)
求導函數的方法:微分
常數函數微分
多項式微分
常數函數微分
多項式微分
加減法
係數積
加減法
係數積
乘法
前微後不微+後微前不微
乘法
除法
母平分之子微母減母微子
除法
鏈鎖律
鏈鎖律
\(f(x,y) = x^2 +xy + y^2\)
怎麼做微分?
算偏導函數的工具
記作 \( \frac{ \partial f}{ \partial x} \)
舉例:
加減法
係數積
乘法
除法
鏈鎖律
是一個向量
記作 \( \nabla f\)
梯度的方向指向曲面上升最快的方向
梯度的大小代表曲面的單位上升率
\(f(x,y)對x作偏微分可以得到梯度在x方向的分量大小\)
\(f(x,y)對y作偏微分可以得到梯度在y方向的分量大小\)
\(\vdots\)
把每個方向的分量合起來就是梯度
梯度指向上升最快的地方
往梯度的反方向走下降最快
逆著梯度走我們就可以找到局部最小值!
聽得懂很好
聽不懂也沒關係
數學可以給你不一樣的觀點
希望大家還是願意來下一堂課
下堂課會比今天簡單很多
Neurons
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(w_1\)
\(w_3\)
\(w_2\)
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b\)
不是所有的刺激都可以引發神經衝動
不是所有的輸入都值得繼續傳遞下去
Activation Function
The Structure of Neural Network
一個類神經網路長這樣
層(Layer)
輸入層
Input Layer
隱藏層
Hidden Layer
輸出層
Output Layer
\(a^{(0)}\)
\(a^{(2)}\)
\(a^{(1)}\)
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
\(w^{(1)}_{0, 0}\)
\(w^{(1)}_{1, 0}\)
\(w^{(1)}_{2, 0}\)
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
\(w^{(1)}_{0,1}\)
\(w^{(1)}_{1,1}\)
\(w^{(1)}_{2,1}\)
我們現在先只關注第(1)層的權重和輸入的關係就好
對應項相乘?
那其實就是這樣?
加權重?
我們就把資料的運算往右推一層了!
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
算法差不多
一些奇聞軼事
Google Net (2014)
22 Layers
Residual Net (2015)
152 layers
Loss Function
神經網路的輸出
理想的輸出
0.0
0.1
0.4
0.8
0.5
0.4
0.3
0.1
0.1
0.9
0.0
1.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
神經網路的輸出
理想的輸出
0.0
0.1
0.4
0.8
0.5
0.4
0.3
0.1
0.1
0.9
0.0
1.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
定義Loss = \(\sum{(\hat y-y)^2}\)
\(\hat y\)
\( y\)
2.14
損失函數:L
輸入:神經網路的所有參數 \(\theta\)
輸出:一個數字(Loss值)
Gradient Descent
\(L( \omega ) 和 所有的w_{i, j}^{(k)}, b_{n}^{(m)} 有關\)
\(可以把L(\omega) 想成 L(w_{0, 0}^{(0)}, w_{1, 0}^{(0)}, \dots, w_{i, j}^{(k)}, b_0^{(0)}, b_1^{(0)}, \dots, b_n^{(m)})\)
\(L(\omega)是一個n變數函數\)
\(n = 神經網路的參數數量\)
\(最小化L(\omega) \Leftrightarrow 找一個n維超曲面的極小點\)
可以把一個超曲面想成一座山
\( \Leftrightarrow \)
\(找一個n維超曲面的極小點\)
\(找山谷的極低點\)
一直往山下走
\(一直往L(\omega)低的地方走\)
想起我們之前教過的梯度
梯度 = \(\nabla F =( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n})\)
梯度指向超曲面上升最快的方向
往反方向走可以快速下降
往超曲面的極小點靠近
\( \omega = (w_1, w_2, \dots, w_n, b_1, b_2, \dots, b_m)\)
\( \omega \rightarrow \omega - \mu \nabla L\)
也就是
\(w_i \rightarrow w_i - \mu \frac{\partial L}{\partial w_i}\)
\(b_j \rightarrow b_j - \mu \frac{\partial L}{\partial b_j}\)
\(\mu : \) Learning rate,一個不大的正數
用這個方法慢慢調整參數
就可以走到Loss最低的地方
這就是梯度下降
BTW. 其實梯度下降不是只有這種調整方法
這種梯度下降方法叫做隨機梯度下降
(Stochastic Gradient Descent, SGD)
Backpropagation
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(w^{(1)}_{0, 0}\)
\(w^{(1)}_{1, 0}\)
\(w^{(1)}_{2, 0}\)
\(w^{(2)}_{0, 0}\)
\(w^{(2)}_{1, 0}\)
\(w^{(2)}_{2, 0}\)
\(w^{(2)}_{3, 0}\)
\(a^{(2)}_1\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(w^{(2)}_{0, 0}\)
\(w^{(2)}_{1, 0}\)
\(w^{(2)}_{2, 0}\)
\(w^{(2)}_{3, 0}\)
\(我們想要利用L更新W^{(2)}\)
\(要求\frac{\partial L}{\partial W^{(2)}}\)
我們沒辦法直接算\(\frac{\partial L} {\partial W}\)
但我們可以算
也就是
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(0)}_2\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(1)}_3\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
前向傳播,利用\(W和B\)計算\(y與Loss\)
反向傳播,利用\(Loss\)計算\(梯度\),修正\(W和B\)
Overfit
理想情況
考古題庫
實際上...
考古題庫
只會寫看過的題目QQ
理想情況
訓練資料
適應所有情況
實際上...
訓練資料
只會判斷訓練資料QQ
機器過度適應於訓練資料
Parameters
Hyperparameters
v.s.
Training dataset
Validation dataset
Testing
dataset
Training dataset
Validation dataset
Testing
dataset
generalization
optimization
機器學習想要做到的兩件事
黑線:
worse optimization
better generalization
綠線:
better optimization
worse generalization
regularization
Dropout
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
Dropout
\(a^{(0)}_0\)
\(a^{(0)}_1\)
\(a^{(1)}_0\)
\(a^{(1)}_1\)
\(a^{(1)}_2\)
\(a^{(2)}_0\)
\(a^{(2)}_1\)
今天是二段前最後一堂課喔
下次上課是12/8
開始會帶實作
Implementation
ML界的Hello World
輸入:
輸出:
圖片
文字
已經有人都幫你寫好標好拉
直接下載來用就好!
Modified National Institute of Standards and Technology database
含有大量已標記的手寫數字圖片
60000筆 training data
10000筆 testing data
由美國普查局員工和高中生寫的
小提醒:記得用私人帳號登入喔!
%env KERAS_BACKEND=tensorflow
%matplotlib inline
import numpy
import matplotlib.pyplot
numpy可以進行矩陣等數學運算
matplotlib可以幫助我們畫圖
#download MNIST
from keras.datasets import mnist
(train_data, train_ans), (test_data, test_ans) = mnist.load_data()
keras都幫我們做好了XD
|
---|
\(\dots\)
train_data
x60000
each image is 28x28
4 | 1 | 7 | 0 |
---|
\(\dots\)
train_ans
x60000
|
---|
\(\dots\)
test_data
x10000
0 | 4 | 8 | 7 |
---|
\(\dots\)
test_ans
x10000
train_data = train_data.reshape(60000, 784) #28 * 28 = 784
test_data = test_data.reshape(10000, 784)
keras都幫我們做好了XD
把二維圖片壓成一維陣列
#output data settings
from keras.utils import np_utils
train_ans = np_utils.to_categorical(train_ans, 10)
test_ans = np_utils.to_categorical(test_ans, 10)
把答案轉換成one hot encoding的格式
前面五步主要在處理資料,方便我們後續神經網路的運作
這個過程叫做資料預處理(Preprocessing)
from keras.models import Sequential # model物件
from keras.layers import Dense, Activation, Dropout #Dense:設定layer的neuron數 Acitvation:激勵函數
from tensorflow.keras.optimizers import SGD #載入stochastic gradient decent的optimzer
model = Sequential() # 建立神經網路物件
layer1_size = 800
model.add(Dense(layer1_size, input_dim = 784)) #新增一個hidden layer(含800個神經元, 輸入維度784)
model.add(Activation('sigmoid')) #新增layer1的activation : sigmoid
model.add(Dropout(0.4))
layer2_size = 800
model.add(Dense(layer2_size, input_dim = layer1_size))#新增一個hidden layer(含800個神經元, 輸入維度800)
model.add(Activation('sigmoid')) #新增layer2的activation : sigmoid
model.add(Dropout(0.4))
output_size = 10
model.add(Dense(output_size, input_dim = layer2_size))
model.add(Activation('softmax')) #新增output layer的activation : sigmoid
#設定loss function : mse(平方平均), optimzer : SGD, learing_rate = 0.1, 評比標準:accuracy
model.compile(loss = 'mse', optimizer = SGD(learning_rate = 0.1), metrics = ['accuracy'])
model.summary()
#train NN
model.fit(train_data, train_ans, batch_size = 50, epochs = 40)
Batch_size
Epoch
選取好的batch_size搭配適當的Epoch訓練出最好的模型
score = model.evaluate(test_data, test_ans)
print("loss : ", score[0])
print("acc : ", score[1])
#show results
from ipywidgets import interact_manual
def test(index) :
matplotlib.pyplot.imshow(test_data[index].reshape(28, 28), cmap = "Greys")
print("神經網路判斷為:", predict[index])
predict = model.predict(test_data)
predict = numpy.argmax(predict, axis = -1)
interact_manual(test, index = (0, 9999))
#save model and parameters
model.save("handwriting_model.h5")
from keras.models import load_model
model2 = load_model("handwriting_model.h5")
Convolution Neural Network
卷積
神經網路
卷積神經網路
Convolution
什麼意思呢?
來看個例子!
圖片這麼大、這麼複雜,怎麼找?
搜尋的圖片
要找的目標
整張圖掃描完以後就會發現他在這邊
試想:要如何在圖片上找到水平線段呢?
先定義好我們要找的目標特徵
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
怎麼量化他們的相似程度?
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(\ast\)
\(0\)
\(0\)
\(29\)
\(0\)
\(170\)
\(255\)
\(0\)
\(86\)
\(255\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
卷積層
全連接層
直線段
橫線段
卷積層一
斜線段
十字
叉叉
卷積層三
圓
左彎
右彎
上彎
卷積層二
\(5 \times 5\)
\(3 \times 3\)
\(3 \times 3\)
\(5 \times 5\)
\(1 \times 1\)
\(5 \times 5\)
Strides
Padding
Pooling
最大池化 Maximum Pooling
其實也可以做平均池化拉,只是效果可能沒那麼好
一張\(n \times n \)的圖
經過\( 2 \times 2 ,步長2\)的池化層後
輸出 \( \frac{n}{2} \times \frac{n}{2}\)的圖
試想:
Feature Map上一格只代表 \(3 \times 3 區域\)
卷積
Feature Map上一格代表 \(4 \times 4 區域\)
卷積
池化
有利於學習更廣域的特徵!
CNN Implementation
ML界的Hello World
輸入:
輸出:
圖片
文字
%env KERAS_BACKEND=tensorflow
%matplotlib inline
import numpy
import matplotlib.pyplot
numpy可以進行矩陣等數學運算
matplotlib可以幫助我們畫圖
#download MNIST
from keras.datasets import mnist
(train_data, train_ans), (test_data, test_ans) = mnist.load_data()
keras都幫我們做好了XD
print(train_data.shape)
print(test_data.shape)
# (60000, 28, 28)
# (10000, 28, 28)
|
---|
\(\dots\)
train_data
x60000
each image is 28x28
4 | 1 | 7 | 0 |
---|
\(\dots\)
train_ans
x60000
|
---|
\(\dots\)
test_data
x10000
0 | 4 | 8 | 7 |
---|
\(\dots\)
test_ans
x10000
#reshape_data:
train_data = train_data.reshape(60000, 28, 28, 1)
test_data = test_data.reshape(10000, 28, 28, 1)
這次不是要壓成一維!
我們還是保持他二維的形狀,這樣才能做卷積
只是把他擴展一個維度,代表這筆輸入資料只有一張圖片
#output data settings
from keras.utils import np_utils
train_ans = np_utils.to_categorical(train_ans, 10)
test_ans = np_utils.to_categorical(test_ans, 10)
把答案轉換成one hot encoding的格式
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.optimizers import SGD
model = Sequential() # 建立神經網路物件
#加入卷積層1
model.add(Conv2D(32, (3, 3), padding = "same", input_shape = (28, 28, 1)))
model.add(Activation("relu"))
#加入池化層1
model.add(MaxPooling2D(pool_size = (2, 2)))
#加入卷積層2
model.add(Conv2D(64, (3, 3), padding = "same"))
model.add(Activation("relu"))
#加入池化層2
model.add(MaxPooling2D(pool_size = (2, 2)))
#加入卷積層3
model.add(Conv2D(128, (3, 3), padding = "same"))
model.add(Activation("relu"))
#加入池化層3
model.add(MaxPooling2D(pool_size = (2, 2)))
#把卷積後的二維矩陣壓平成一維
model.add(Flatten())
#丟入全連接層
model.add(Dense(200, input_dim = 28 * 28))
model.add(Activation("relu"))
#輸出層
model.add(Dense(10, input_dim = 200))
model.add(Activation("softmax"))
#設定loss function : mse(平方平均), optimzer : SGD, learing_rate = 0.008, 評比標準:accuracy
model.compile(loss = 'mse', optimizer = SGD(learning_rate = 0.008), metrics = ['accuracy'])
model.summary()
#train CNN
model.fit(train_data, train_ans, batch_size = 50, epochs = 20)
Batch_size
Epoch
選取好的batch_size搭配適當的Epoch訓練出最好的模型
score = model.evaluate(test_data, test_ans)
print("loss : ", score[0])
print("acc : ", score[1])
predict = model.predict(test_data)
predict = numpy.argmax(predict, axis = -1)
def test(index) :
matplotlib.pyplot.imshow(test_data[index].reshape(28, 28), cmap = "Greys")
print("神經網路判斷為:", predict[index])
from ipywidgets import interact_manual
interact_manual(test, index = (0, 9999))
#save model and parameters
model.save("handwriting_model.h5")
Recursive Neural Network
遞迴神經網路 (Recursive Neural Network, RNN)
遞迴:重複的利用自己
在 自然語言處理領域 的王者
Natural Learning Processing
NLP
自然語言:人類日常溝通使用的語言
Eg : 中文、英文、日文、西班牙文、德文\( \dots \)
教機器學會認知、理解、生成自然語言
語音識別、機器翻譯、文字情感分析、聊天機器人\( \dots \)
The movie is fantastic.
What a horrible film.
機器
Positive
Negative
其實這算是RNN的入門經典問題啦,
網路上有個資料集叫IMDB,有興趣可以做做看
但這樣只能處理固定長度的文本輸入QQ
(也只能輸出固定長度的輸出TAT)
我們要打破輸入&輸出維度的限制
不如不要一次輸入整個句子
改成一次輸入一個詞輸入很多次
RNN
RNN
RNN
RNN
RNN
The
movie
is
fantastic
<end>
Positive
但是這樣記不住啊啊啊~我們需要讓RNN有記憶!
把先前的輸入打包成一個記憶存起來
輸入下個詞的時候,把記憶也視為輸入的一部份一起處理
每次處理完輸出一份新的記憶
RNN
RNN
RNN
RNN
RNN
The
movie
is
fantastic
<end>
Positive
.
(Memory)
(Memory)
(Memory)
(Memory)
Simple RNN
每個神經元都有自己的記憶
要讓整個RNN有記憶就從個別的神經元下手
Simple RNN
回想我們基本神經元的構造:
\( \sigma(x) \)
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b\)
讓他有記憶:\(h\)
用下標t表示不同時間的記憶:\(h_t\)
\(h\)
\(h_t\)
Simple RNN
\( \sigma(x) \)
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b\)
\(h_t\)
同時,輸入也多了前一個時刻的記憶\( h_{t-1} \)
\(h_{t-1}\)
\(u_1\)
Simple RNN
\( \sigma(x) \)
\(x_1\)
\(x_2\)
\(x_3\)
\(y\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b\)
\(h_t\)
\(h_{t-1}\)
\(u_1\)
於是,計算方式從
擴展成
只是這原本作為輸出\(y\),
但現在改作為新記憶\(h_t\)
\(h_t\)
Simple RNN
\(h_{t-1}\)
\(u_1\)
為了避免混淆,我們將\(X與Y也加上時間下標t\)
並將\(W, U, b, \sigma \)加上下標\(h\)表示這是計算\(h\)的權重、偏值與激勵函數
\(h_t\)
\( \sigma(x) \)
\(x_1\)
\(x_2\)
\(x_3\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b\)
\(b_h\)
\( \sigma_h(x) \)
Simple RNN
而輸出\(y_t\)則是將記憶\(h_t\)再做一次線性變換後丟進\( \sigma(x) \)裡面
注意這邊的\(W_y, b_y, \sigma_y和W_h, b_h, \sigma_h是不同的\)
\(h_{t-1}\)
\(u_1\)
\(h_t\)
\(x_1\)
\(x_2\)
\(x_3\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b_h\)
\( \sigma_h(x) \)
\(w_y\)
\(b_y\)
\( \sigma_y(x) \)
\(y_t\)
Simple RNN
\(h_{t-1}\)
\(u_1\)
\(h_t\)
\(x_1\)
\(x_2\)
\(x_3\)
\(w_1\)
\(w_3\)
\(w_2\)
\(b_h\)
\( \sigma_h(x) \)
\(w_y\)
\(b_y\)
\( \sigma_y(x) \)
\(y_t\)
\(x_1\)
\(x_2\)
\(x_3\)
\(w_1\)
\(w_3\)
\(w_2\)
\(u_1\)
\(h_{t+1}\)
\(b_h\)
\( \sigma_h(x) \)
\(w_y\)
\(b_y\)
\( \sigma_y(x) \)
\(y_{t+1}\)
到此,我們已經學會了一種最基本的RNN記憶模型
所以現在大家比較常用的是
個人覺得講得非常好,有興趣深入了解LSTM的人可以去看