Mẹo Hướng dẫn Bilstm là gì Chi Tiết
You đang tìm kiếm từ khóa Bilstm là gì được Cập Nhật vào lúc : 2022-02-12 16:48:16 . Với phương châm chia sẻ Mẹo về trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi tìm hiểu thêm tài liệu vẫn ko hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Tác giả lý giải và hướng dẫn lại nha.
Recurrent Neural Network: Từ RNN đến LSTM
1. Introduction
Đối với những bạn học deep learning thì không thể không biết tới RNN, một thuật toán cực kỳ quan trọng chuyên xử lý thông tin dạng chuỗi. Đầu tiên, hãy nhìn xem RNN hoàn toàn có thể làm gì. Dưới đấy là một vài ví dụ.
Nội dung chính
- Recurrent Neural Network: Từ RNN đến LSTM
1. Introduction2. Recurrent Neural NetworkÝ tưởng căn bảnTính toán Viral ngược. (BPTT – Backpropagation Through Time)Hạn chế của RNN là gì?3. LSTM (Long Short-term memory)Tổng kết4. ReferenceVideo liên quan
- Machine Translation (Dịch máy)
Mô hình hóa ngôn từ và sinh văn bản: đây có lẽ rằng là kĩ năng ấn tượng nhất riêng với mình.
Nhận dạng giọng nói
Mô tả hình ảnh: RNN phối hợp cùng CNN để sinh ra mô tả cho hình ảnh không được gán nhãn. Đây cũng là một bài tập khá hay mà mình sẽ trình làng trong nội dung bài viết tiếp theo.
Vậy, làm thế nào RNN làm được những việc này? Hi vọng thông qua nội dung bài viết này mình hoàn toàn có thể phục vụ một chiếc nhìn rõ ràng và dễ hiêủ về RNN.
Let’s go !!!
2. Recurrent Neural Network
Ý tưởng cơ bản
Một cách nôm na, riêng với mạng neural thông thường, toàn bộ chúng ta cho toàn bộ tài liệu vào cùng một lúc. Nhưng đôi lúc, tài liệu của toàn bộ chúng ta mang ý nghĩa trình tự, tức nếu thay đổi trình tự tài liệu, kết quả sẽ khác.
Dễ thấy rõ ràng nhất ở tài liệu văn bản. Ví dụ, Con ăn cơm chưa và Con chưa ăn cơm, nếu tách mỗi câu theo từ, ta được bộ vocab [ con, ăn, cơm, chưa], one hot encoding và cho toàn bộ vào mạng neural , hoàn toàn có thể thấy ngay, không còn sự phân biệt nào giữa 2 câu trên. Việc hòn đảo thứ tự duyệt những từ làm sai lệch ý nghĩ của câu.
Nói cách khác, toàn bộ chúng ta cần một mạng neural hoàn toàn có thể xử lí tuần tự.
Vậy làm thế nào để xử lí tuần tự, thứ nhất cần đưa nguồn vào vào một trong những cách tuần tự.
Mình là kiểu người hiểu nhanh hơn thông qua hình ảnh , và mình nghĩ đấy là hình ảnh thể hiện rõ ràng nhất rốt cuộc RNN làm gì. Mỗi block RNN sẽ lấy thông tin từ những block trước và input hiện tại.
Các x ở đây đại diện thay mặt thay mặt cho tài liệu nguồn vào lần lượt (được chia theo time step).
xtx_txt đại diện thay mặt thay mặt cho time step thứ t, và yty_tyt là output của một step.
Ví dụ, x2x_2x2 sẽ là vector đại diện thay mặt thay mặt của từ thứ hai trong câu văn bản.
Hình ảnh dưới đây đã cho toàn bộ chúng ta biết rõ hơn điều gì thực sự xẩy ra trong một step.
- Hidden state hth_tht (trong một số trong những tài liệu tường ký hiện sts_tst). Đây đó đó là bộ nhớ của mạng. hth_tht là tổng hợp thông tin của hidden state trước ( ht1h_t-1ht1) cộng với input tại time step t ( xtx_txt). Activation function ở đây $g_1$hầu hết là tanh hoặc ReLu.
ht=g1(Whhht1+Whxxt+bh) h_t = g1 ( W_hh * h_t-1 + W_hx * x_t + b_h )
ht=g1(Whhht1+Whxxt+bh)
Hoặc hoàn toàn có thể viết gọn hơn:
ht=g1((WhhWhx)(ht1xt)) h_t = g1 ( ( W_hh W_hx) ( beginmatrix h_t-1 \ x_t endmatrix))
ht=g1((WhhWhx)(ht1xt))
ht=g1((W)(ht1xt)) h_t = g1 ( ( W) ( beginmatrix h_t-1 \ x_t endmatrix))
ht=g1((W)(ht1xt))
- Output của từng time step yty_tyt : Tại 1 block của mạng RNN có 2 đầu ra. Trong số đó, hth_tht là tổng hợp thông tin của những state trước để tiếp tục truyền đi trong chuỗi mạng, và ta có thêm yty_tyt là output của từng time step một. Ở đây g2g_2g2 thường là hàm softmax.
yt=g2(Wyhht+by) y_t = g2 ( W_yh * h_t + b_y )
yt=g2(Wyhht+by)
Rất đơn thuần và giản dị và cơ bản.
Một step của RNN hoàn toàn có thể được triển khai bằng code numpy như sau:
def rnn_step_forward(x, prev_h, Wx, Wh, b):
“””
The input data has dimension D, the hidden state has dimension H,
and the minibatch is of size N.
Inputs:
– x: Input data for this timestep, of shape (N, D)
– prev_h: Hidden state from previous timestep, of shape (N, H)
– Wx (Whx): Weight matrix for input-to-hidden connections, of shape (D, H)
– Wh (Whh): Weight matrix for hidden-to-hidden connections, of shape (H, H)
– b: Biases of shape (H,)
Returns a tuple of:
– next_h: Next hidden state, of shape (N, H)
– cache: Tuple of values needed for the backward pass.
“””
next_h, cache = None, None
next_h = np.tanh(x @ Wx + prev_h @ Wh + b) # N x H
cache = (x, prev_h, Wx, Wh, next_h)
return next_h, cache
Tính toán Viral ngược. (BPTT – Backpropagation Through Time)
Như vậy, trong quy trình training, có 3 tham số toàn bộ chúng ta cần tìm là Whh,Whx,WyhW_hh,W_hx, W_yhWhh,Whx,Wyh.
Chúng ta cần tính LWhx,LWhhLWhyfrac partial L partial W_hx ,frac partial L partial W_hh
frac partial L partial W_hyWhxL,WhhLWhyL. (với LLL là loss function)
(Do quá lười type công thức) Các bạn hoàn toàn có thể tìm hiểu thêm phần tính đạo hàm khá đầy đủ dùng chain rule trong nội dung bài viết này của anh Tuan Nguyen (hoặc nhiều toán hơn thế nữa ở đây).
Nhìn chung, ta hoàn toàn có thể thấy yếu tố cơ bản ở đấy là:
Trong mạng NN truyền thống cuội nguồn, ta không chia sẻ tham số Một trong những tầng mạng. Tuy vậy, với RNN, ta hoàn toàn có thể thấy, để tính đạo hàm của loss theo WhhW_hhWhh, ta tùy từng ht1h_t-1ht1, mà ht1h_t-1ht1 lại tùy từng ht2h_t-2ht2 và xt1x_t-1xt1. Nói nôm na, ta phải cộng toàn bộ đầu ra ở tiến trình trước để tính đạo hàm. Điều này gây ra một hạn chế lớn cho RNN.
def rnn_step_backward(dnext_h, cache):
“””Backward pass for a single timestep.
Inputs:
– dnext_h: Gradient of loss with respect to next hidden state, of shape (N, H)
– cache: Cache object from the forward pass
Returns a tuple of:
– dx: Gradients of input data, of shape (N, D)
– dprev_h: Gradients of previous hidden state, of shape (N, H)
– dWhx: Gradients of input-to-hidden weights, of shape (D, H)
– dWhh: Gradients of hidden-to-hidden weights, of shape (H, H)
– db: Gradients of bias vector, of shape (H,)
“””
dx, dprev_h, dWhx, dWhh, db = None, None, None, None, None
x, prev_h, Whx, Whh, next_h = cache
d_tanh = dnext_h*(1.0 – next_h**2) # N x H
dx = d_tanh.dot(Whx.T) # N x D
dprev_h = d_tanh.dot(Whh.T) # N x H
dWhx = x.T.dot(d_tanh) # D x H
dWhh = prev_h.T.dot(d_tanh) # H x H
db = np.sum(d_tanh, axis=0) # 1 x H
return dx, dprev_h, dWhx, dWhh, db
Implement code RNN sử dụng thư viện tương hỗ PyTorch:
import torch
from torch import nn
class Model(nn.Module):
def __init__(self, input_dim, output_dim, hidden_dim, n_layers):
super(Model, self).__init__()
self.hidden_dim = hidden_dim
self.n_layers = n_layers
# RNN Layer
self.rnn = nn.RNN(input_dim, hidden_dim, n_layers, batch_first=True)
# Fully connected layer
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
batch_size = x.size(0)
# Initializing hidden state for first input using method defined below
hidden = self.init_hidden(batch_size)
# Passing in the input and hidden state into the model and obtaining outputs
out, hidden = self.rnn(x, hidden)
# Reshaping the outputs -> fit into the fully connected layer
out = out.contiguous().view(-1, self.hidden_dim)
out = self.fc(out)
return out, hidden
def init_hidden(self, batch_size):
# Generates the first hidden state of zeros in forward
hidden = torch.zeros(self.n_layers, batch_size, self.hidden_dim)
return hidden
Implement code sử dụng thư viện TensorFlow:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential()
model.add(layers.Embedding(input_dim=input_dim, output_dim=output_dim))
# Add a LSTM layer with 128 internal units.
model.add(layers.RNN(128))
# Add a Dense layer with 10 units. (10 classes)
model.add(layers.Dense(10))
model.summary()
Như vậy, so với mạng NN thông thường, RNN hoàn toàn có thể tóm gọn thông tin dạng chuỗi. Điều này cũng góp thêm phần giúp RNN hoàn toàn có thể phục vụ chuỗi nguồn vào có độ dài tùy ý, kích thước model không biến thành tùy từng size nguồn vào.
Hạn chế của RNN là gì?
Phải thực thi tuần tự: Không tận dụng được kĩ năng tính toán tuy nhiên tuy nhiên của máy tính (GPU/TPU).
Vanishing gradient (Đạo hàm bị triệt tiêu)
Vì hàm kích hoạt (tanh hay sigmoid) của ta sẽ cho kết quả đầu ra nằm trong đoạn [1,1][-1, 1][1,1] (với sigmoid là [0,1][0, 1][0,1]) nên đạo hàm của nó sẽ bị đóng trong mức chừng [0,1][0, 1][0,1] (với sigmoid là [0,0.25][0, 0.25][0,0.25]).
Ở trên, toàn bộ chúng ta đã dùng chain rule để tính đạo hàm. Có một yếu tố ở đấy là, hàm tanh lẫn sigmoid đều phải có đạo hàm bằng 0 tại 2 đầu. Mà khi đạo hàm bằng 0 thì nút mạng tương ứng tại này sẽ bị bão hòa. Lúc đó những nút phía trước cũng tiếp tục bị bão hoà theo. Nên với những giá trị nhỏ trong ma trận, khi ta thực thi phép nhân ma trận sẽ đạo hàm tương ứng sẽ xẩy ra Vanishing gradient, tức đạo hàm bị triệt tiêu chỉ với sau vài bước nhân. Như vậy, tiến trình ở xa sẽ không còn hề tác dụng với nút hiện tại nữa, làm cho RNN không thể học được những phụ thuộc xa. việc này sẽ không còn riêng gì có xẩy ra với mạng RNN mà trong cả mạng neural truyền thống cuội nguồn với nhiều lớp cũng luôn có thể có hiện tượng kỳ lạ này.
Với quan điểm như trên, ngoài Vanishing gradient, ta còn gặp phải Exploding Gradient (bùng nổ đạo hàm). Tùy thuộc vào hàm kích hoạt và tham số của mạng, yếu tố này xẩy ra khi những giá trị của ma trận là lớn (to nhiều hơn 1). Tuy nhiên, người ta thường nói về yếu tố Vanishing nhiều hơn nữa là Exploding, vì 2 nguyên do sau.
Thứ nhất, bùng nổ đạo hàm hoàn toàn có thể theo dõi được vì khi đạo hàm bị bùng nổ thì ta sẽ thu được kết quả là một giá trị phi số NaN làm cho chương trình của ta bị dừng hoạt động và sinh hoạt giải trí.
Thứ hai, bùng nổ đạo hàm hoàn toàn có thể ngăn ngừa được khi ta đặt một ngưỡng giá trị trên (tìm hiểu thêm kỹ thuật Gradient Clipping). Còn rất khó để theo dõi sự mất mát đạo hàm cũng như tìm cách xử lí nó.
Để xử lý Vanishing Gradient, có 2 cách phổ cập:
Cách thứ nhất, thay vì sử dụng activation function là tanh và sigmoid, ta thay bằng ReLu (hoặc những biến thể như Leaky ReLu). Đạo hàm của ReLu hoặc là 0 hoặc là một trong, nên ta hoàn toàn có thể trấn áp phần nào yếu tố mất mát đạo hàm.
Cách thứ hai, ta thấy RNN thuần không hề có thiết kế nào để lọc đi những thông tin không thiết yếu. Ta thiết yếu kế một kiến trúc hoàn toàn có thể nhớ dài hạn hơn, đó là LSTM và GRU.
3. LSTM (Long Short-term memory)
Mình nghĩ hình ảnh sau này là rõ ràng nhất để so sánh giữa RNN và LSTM.
RNN
Hình 3.1
LSTM
Hình 3.2
Về cơ bản, ý tưởng không rất khác nhau là mấy. Chúng ta chỉ thêm một số trong những tính toán ở đây. Tất cả được tóm tắt trong hình sau.
Đầu tiên, toàn bộ chúng ta có i,f,gi, f, gi,f,g có công thức gần tương tự hệt nhau và chỉ khác mỗi ma trận tham số. Chính ma trận này sẽ quyết định hành động hiệu suất cao rất khác nhau của từng cổng. σsigmaσ là ký hiệu của hàm sigmoid. Quan sát hình 3.2 để thấy rõ hơn vị trí những cổng:
Input gate iii – cổng vào.
Cổng vào giúp quyết định hành động bao nhiêu lượng thông tin nguồn vào sẽ ảnh hưởng đến trạng thái mới. Quyết định bằng phương pháp nào, thông qua điểm lưu ý của hàm sigmoid (đầu ra nằm trong mức chừng [0,1][0,1][0,1]), như vậy khi một vector thông tin trải qua đây, nếu nhân với 0, vector sẽ bị triệt tiêu hoàn toàn. Nếu nhân với cùng 1, hầu hết thông tin sẽ tiến hành giữ lại.
Tương tự như vậy, fff là forget gate – cổng quên.
Cổng quyết định hành động sẽ bỏ đi bao nhiêu lượng thông tin tới từ trạng thái trước đó.
Cuối cùng, cổng ooo là output gate – cổng ra.
Cổng kiểm soát và điều chỉnh lượng thông tin hoàn toàn có thể ra ngoài yty_tyt và lượng thông tin truyền tới trạng thái tiếp theo.
Tiếp theo, g thực ra cũng chỉ là một trạng thái ẩn được xem nhờ vào nguồn vào hiện tại xtx_txt và trạng thái trước ht1h_t-1ht1. Tính hoàn toàn tương tự như input gate, chỉ thay vì dùng sigmoid, ta dùng tanh. Kết hợp hai điều nó lại để update trạng thái mới.
Cuối cùng, ta có ctc_tct là bộ nhớ trong của LSTM. Nhìn vào công thức, hoàn toàn có thể thấy nó là tổng hợp của cục nhớ trước ct1c_t-1ct1 đã được lọc qua cổng quên f, cộng với trạng thái ẩn g đã được lọc bởi cổng vào i. Cell state sẽ mang thông tin nào quan trọng truyền ra đi hơn và sẽ tiến hành dùng khi cần. Đây đó đó là long term memory.
Sau khi có ctc_tct, ta sẽ đưa nó qua cổng ra để lọc thông tin một lần nữa, thu được trạng thái mới hth_tht.
Nếu nhìn kỹ một chút ít, ta hoàn toàn có thể thấy RNN truyền thống cuội nguồn là dạng đặc biệt quan trọng của LSTM. Nếu thay giá trị đầu ra của input gate là một trong và đầu ra forget gate là 0 (không nhớ trạng thái trước), ta được RNN thuần.
def lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b):
“””
Forward pass for a single timestep of an LSTM.
The input data has dimension D, the hidden state has dimension H, and we use
a minibatch size of N.
Inputs:
– x: Input data, of shape (N, D)
– prev_h: Previous hidden state, of shape (N, H)
– prev_c: previous cell state, of shape (N, H)
– Wx: Input-to-hidden weights, of shape (D, 4H)
– Wh: Hidden-to-hidden weights, of shape (H, 4H)
– b: Biases, of shape (4H,)
Returns a tuple of:
– next_h: Next hidden state, of shape (N, H)
– next_c: Next cell state, of shape (N, H)
– cache: Tuple of values needed for backward pass.
“””
next_h, next_c, cache = None, None, None
H = b.shape[0] // 4
a = x.dot(Wx) + prev_h.dot(Wh) + b
i = sigmoid(a[:, :H])
f = sigmoid(a[:, H:2*H])
o = sigmoid(a[:, 2*H:3*H])
g = np.tanh(a[:, 3*H:4*H])
next_c = f*prev_c + i*g
next_h = o * np.tanh(next_c)
cache = (x, Wx, prev_h, Wh, b, a, prev_c, i, f, o, g, next_c, next_h)
return next_h, next_c, cache
Tổng kết
Nhìn một lượt qua kiến trúc LSTM, ta hoàn toàn có thể tóm tắt:
- Thứ nhất, LSTM có long-term memory. Tuy nhiên, ht,gth_t, g_tht,gt khá giống với RNN truyền thống cuội nguồn, tức có short-term memory. Nhìn chung, LSTM xử lý và xử lý phần nào vanishing gradient so với RNN, nhưng chỉ một phần.
Với lượng tính toán như trên, RNN đã chậm, LSTM nay còn chậm hơn.
Tuy vậy, với những tăng cấp cải tiến so với RNN thuần, LSTM đã và đang rất được sử dụng phổ cập. Trên thực tiễn, cách setup LSTM cũng rất phong phú và linh hoạt theo bài toán, tuy nhiên vẫn nhờ vào LSTM chuẩn như trên.
4. Reference
RNN cheatsheet của cs231n:
://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks#architecture
Phần code được tìm hiểu thêm từ Assignment 3 của cs231n.
://cs231n.github.io/
Nếu bạn muốn đọc rõ hơn về những công thức LSTM:
://colah.github.io/posts/2015-08-Understanding-LSTMs/
Phiên bản tiếng Việt của nó ở đây:
://dominhhai.github.io/vi/2022/10/what-is-lstm/#3-2-bên-trong-lstm
Một số phương pháp trấn áp Vanishing Gradient:
://viblo.asia/p./ORNZqPEeK0n
Reply
5
0
Chia sẻ
Review Bilstm là gì ?
Bạn vừa đọc Post Với Một số hướng dẫn một cách rõ ràng hơn về Clip Bilstm là gì tiên tiến và phát triển nhất
Chia Sẻ Link Cập nhật Bilstm là gì miễn phí
Hero đang tìm một số trong những ShareLink Tải Bilstm là gì Free.
Thảo Luận vướng mắc về Bilstm là gì
Nếu You sau khi đọc nội dung bài viết Bilstm là gì , bạn vẫn chưa hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Ad lý giải và hướng dẫn lại nha
#Bilstm #là #gì