- vừa được xem lúc

LSTM: RNN phiên bản nâng cấp

0 0 1

Người đăng: Huey Anthony Disward

Theo Viblo Asia

Giới thiệu về LSTM

Hi mọi người, mình là Hiếu, ở bài viết trước mình có giới thiệu về RNN. Tuy RNN là một mô hình khá hay nhưng nó vẫn sẽ rất có thể bị Exploding Gradient hoặc Vanishing Gradient, từ đó gây ra hiện tượng đầu ra sai lệch cho mô hình. Hôm nay mình sẽ giới thiệu cho các bạn về LSTM – một mô hình có thể coi là một sự nâng cấp của RNN, giúp hạn chế hiện tượng Exploding GradientVanishing Gradient.

1. Định nghĩa về LSTM

LSTM (Long Short-Term Memory) là một loại mạng nơ-ron hồi tiếp (RNN) được thiết kế để giải quyết vấn đề về việc ghi nhớ thông tin trong chuỗi dữ liệu dài hạn, vốn là điểm yếu của các RNN truyền thống do hiện tượng mất dần/lan truyền gradient. LSTM nổi bật bởi khả năng lưu trữ và truy xuất thông tin trong thời gian dài thông qua cấu trúc đặc biệt của các "cổng" (gates).

Sơ đồ hoạt động của LSTM như sau:

Nhìn rất quen đúng chứ, chúng ta có thể nói vui với nhau rằng LSTM là một RNN với những trang bị xịn hơn. Điểm đặc trưng của LSTM là các cổng, giúp kiểm soát việc truy xuất thông tin và việc lưu trữ.

LSTM bao gồm các đơn vị bộ nhớ (hay còn gọi là các memory cell) và 3 cổng chính để điều chỉnh luồng thông tin:

  • Cổng quên (Forget Gate): Quyết định thông tin nào từ trạng thái ô (cell state) sẽ bị loại bỏ. Cổng quên sử dụng hàm sigmoid để tạo ra giá trị từ 0 (quên hoàn toàn) đến 1 (giữ hoàn toàn).
  • Cổng nhập (Input Gate): Quyết định xem thông tin mới nào sẽ được thêm vào trạng thái ô. Cổng này cũng sử dụng hàm sigmoid để quyết định và hàm tanh để tạo ra giá trị mới.
  • Cổng xuất (Output Gate): Quyết định thông tin nào từ trạng thái ô sẽ được sử dụng để tạo đầu ra. Kết hợp sigmoid và tanh để lọc và truyền thông tin.

Trạng thái ô (cell state) là "bộ nhớ dài hạn" của LSTM, cho phép lưu trữ thông tin qua nhiều bước thời gian. Trạng thái ẩn (hidden state) là đầu ra ngắn hạn, truyền thông tin đến bước tiếp theo.

Cơ chế hoạt động của LSTM

  1. Bước 1: Quên thông tin không cần thiết: Cổng quên sử dụng đầu vào hiện tại và trạng thái ẩn trước đó để quyết định thông tin nào trong trạng thái ô nên được bỏ đi.
  2. Bước 2: Cập nhật trạng thái ô: Cổng nhập chọn thông tin mới để thêm vào trạng thái ô, kết hợp với giá trị được tạo từ hàm tanh.
  3. Bước 3: Tạo đầu ra: Cổng xuất lọc trạng thái ô qua hàm tanh và sigmoid để tạo trạng thái ẩn mới, đồng thời là đầu ra của bước hiện tại.

Ưu điểm của LSTM

  • Xử lý chuỗi dài: Nhờ cơ chế trạng thái ô, LSTM có thể lưu giữ thông tin qua nhiều bước thời gian, phù hợp với các bài toán như dịch máy, phân tích cảm xúc, hay dự đoán chuỗi thời gian.
  • Khắc phục vấn đề gradient: Cổng quên và cổng nhập giúp điều chỉnh luồng thông tin, giảm thiểu vấn đề gradient biến mất hoặc bùng nổ.
  • Linh hoạt: Có thể áp dụng cho nhiều loại dữ liệu chuỗi, từ văn bản, âm thanh đến dữ liệu tài chính.

Hạn chế

  • Phức tạp tính toán: LSTM yêu cầu nhiều tài nguyên tính toán hơn RNN thông thường do cấu trúc cổng phức tạp.
  • Khó tối ưu hóa: Việc huấn luyện LSTM có thể phức tạp, đòi hỏi kỹ thuật điều chỉnh siêu tham số cẩn thận.
  • Bị thay thế bởi Transformer: Trong nhiều ứng dụng hiện đại (như NLP), mô hình Transformer (như BERT, GPT) tỏ ra hiệu quả hơn nhờ cơ chế attention.

2. Chi tiết hoạt động của LSTM

Ok, sơ lược về cách hoạt động của LSTM là như vậy, nhưng mà để hiểu rõ ta cần sử dụng thêm một chút toán nữa, sau đây là cách các thành phần trong LSTM được tính toán.

Trước khi đi vào chi tiết từng công thức, mình sẽ chú thích các thành phần trong LSTM, cũng như RNN, đa số có các ký hiệu mà chúng ta rất quen:

  • xtx_t: Đầu vào tại thời điểm tt (vector đầu vào). Đây là dữ liệu được nhận ở bước hiện tại (ví dụ như là 1 từ trong câu, giá trị đo tại thời điểm tt,...).

  • ht1h_{t-1}: Trạng thái ẩn của bước trước đó (t1t-1). Chứa thông tin của toàn bộ chuỗi dữ liệu trước thời điểm tt, như một bộ nhớ ngắn hạn.

  • Wf,Wi,WC,WOW_f, W_i, W_C, W_O: Ma trận trọng số cho từng thành phần của mạng:

    • WfW_f: Trọng số của cổng quên (forget gate).
    • WiW_i: Trọng số cổng nhập (input gate).
    • WCW_C: Trọng số tạo giá trị ứng viên (candidate state).
    • WOW_O: Trọng số cổng xuất (output gate).

    Các ma trận là các tham số học được trong quá trình huấn luyện, quyết định độ quan trọng của đầu vào và các trạng thái ẩn trước đó để tính tín hiệu cho từng cổng.

  • bf,bi,bC,bOb_f, b_i, b_C, b_O: Các vector bias cho từng cổng:

    • bfb_f: Bias cho cổng quên.
    • bib_i: Bias cho cổng nhập.
    • bCb_C: Bias cho giá trị ứng viên.
    • bOb_O: Bias cho cổng xuất.

    Bias giúp tăng tính linh hoạt cho mô hình khi kết hợp với các phép nhân ma trận.

  • Ct1C_{t-1}: Trạng thái ô (Cell state) tại thời điểm t1t-1, là bộ nhớ dài hạn của LSTM có chức năng lưu trữ thông tin quan trọng xuyên suốt chuỗi dữ liệu.

  • σ\sigma: Hàm kích hoạt sigmoid, cho đầu ra từ 0 đến 1 giúp điều khiển mức độ thông tin đi qua các cổng.

  • tanh\tanh: Hàm kích hoạt tanh, cho đầu ra từ -1 đến 1 để chuẩn hóa giá trị cập nhật trạng thái ô và trạng thái ẩn.

Cổng quên (Forget Gate)

ft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)

Hàm sigmoid cho đầu ra từ 0 đến 1 để cho cổng quên quyết định nên giữ lại hay loại bỏ thông tin nào từ trạng thái của ô trước Ct1C_{t-1}:

  • Nếu ftf_t gần 1: Giữ lại thông tin cũ.
  • Nếu ftf_t gần 0: Quên thông tin đó.

Cổng nhập (Input Gate)

it=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)

Cổng nhập cũng sử dụng hàm sigmoid để xác định mức độ để cập nhật trạng thái mới, cổng này sẽ kiểm soát lượng thông tin mới sẽ được thêm vào trạng thái ô hiện tại.

Giá trị ứng viên trạng thái ô (Candidate Cell State)

C~t=tanh(WC[ht1,xt]+bC)\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)

Hàm tanh cho giá trị từ -1 đến 1 nhằm tạo ra một giá trị ứng viên để bổ sung thông tin mới vào trạng thái ô.

Cập nhật trạng thái ô (Cell State Update)

Ct=ftCt1+itC~tC_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C}_t

Trạng thái ô tại thời điểm tt là sự kết hợp giữa thông tin cũ (sau khi đã được chọn lọc bởi cổng quên) và thông tin mới (được xác định qua cổng nhập và giá trị ứng viên). Phép toán sẽ nhân từng thành phần để chọn lọc thông tin giữ lại và thông tin mới.

Cổng xuất (Output Gate)

ot=σ(Wo[ht1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)

Cổng xuất quyết định phần nào của trạng thái ô sẽ được đưa ra làm trạng thái ẩn hth_t, là đầu ra của LSTM tại thời điểm hiện tại.

Trạng thái ẩn (Hidden State)

ht=ottanh(Ct)h_t = o_t \cdot \tanh(C_t)

Trạng thái ẩn là đầu ra cuối cùng của ô, sẽ làm đầu vào cho bước tiếp theo hoặc lớp phía sau (Chẳng hạn như lớp dự đoán).

3. Quy trình huấn luyện của LSTM

Ok, nếu mọi người đã đọc đến đây, thì hoàn toàn các bạn đã hiểu về cơ chế của LSTM rồi đó, bởi vì quy trình huấn luyện LSTM bao gồm các bước cơ bản giống với RNN: Lan truyền thuận -> Tính hàm mất mát -> Lan truyền ngược -> Cập nhật trọng số. Cái khác là LSTM có cấu trúc phức tạp nên các bước này có những đặc điểm riêng.

3.1 Lan truyền thuận (Forward Propagation)

Giống với RNN, tại mỗi bước thời gian tt, mạng nhận đầu vào xtx_t, kết hợp với trạng thái ẩn trước ht1h_{t-1}, tính trạng thái ẩn mới hth_t và tạo đầu ra thông qua một phép biến đổi (Ở đây mình dùng hàm tanh\tanh như đã trình bày ở trên).

Tuy nhiên với cấu trúc đặc biệt, LSTM sử dụng trạng thái ô và trạng thái ẩn cùng với 3 cổng để xử lý thông tin, quy trình của chúng mình đã trình bày ở cơ chế hoạt động ở mục 1.

3.2 Tính hàm mất mát (Loss)

Giống như RNN, hàm mất mát được tính dựa trên sự khác biệt giữa đầu ra dự đoán (Dựa trên hth_t) và giá trị thực tế. Các hàm mất mát phổ biến gồm MSE cho bài toán hồi quy hoặc Cross-Entropy Loss cho bài toán phân loại.

Bước này ở LSTM không có khác biệt lớn, chỉ là LSTM thường được dùng trong các bài toán phức tạp (Dịch máy, dự đoán chuỗi), hàm mất mát có thể được tính trên toàn bộ chuỗi hoặc trên các đầu ra tại mỗi bước thời gian.

3.3 Lan truyền ngược qua thời gian (Backpropagation Through Time – BPTT)

Điểm giống với RNN là Gradient của hàm mất mát được tính ngược từ đầu ra về các tham số (Các trọng số WW và bias bb) qua các bước thời gian. Gradient sẽ được truyền ngược qua các trạng thái ẩn để cập nhật trọng số.

Tuy nhiên, điểm “ăn tiền” của LSTM là:

  • Tránh “biến mất” gradient: Nhờ cơ chế trạng thái ô và các cổng, LSTM duy trì thông tin qua các bước thời gian dài hiệu quả hơn. Trạng thái ô (CtC_t) truyền thông tin gần như tuyến tính, giảm thiểu việc gradient bị thu hẹp quá mức.
  • Lan truyền ngược qua trạng thái ô: Trạng thái ô (CtC_t) được cập nhật liên tục qua các bước thời gian, và gradient được truyền ngược qua CtC_tftf_t, giúp duy trì thông tin dài hạn.

Nhưng mà, với một đầu ra xịn hơn so với RNN, thì nó cũng phải bắt buộc thực hiện nhiều phép tính toán phức tạp hơn và nhiều hơn mà cụ thể là trong việc tính gradient:

  • Gradient của hàm mất mát được tính qua hth_t, sau đó lan truyền ngược qua oto_t, CtC_t, ftf_t, iti_tC~t\tilde{C}_t.
  • Các cổng sử dụng hàm sigmoid và tanh, nên gradient được tính bằng các áp dụng chain rule.

Nếu như bạn đã quên, thì công thức chain rule là:

Nếu:
y=f(u)y = f(u)
u=g(x)u = g(x)
Thì:

dydx=dydududx\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}

3.4 Cập nhật trọng số

LSTM cũng sử dụng các thuật toán tối ưu (Như SGD, Adam,…) Để cập nhật các tham số dựa trên Gradient:

WWηLWW \leftarrow W - \eta \cdot \frac{\partial L}{\partial W}

Với η\etalearning rate, WW là tham số.

Trong LSTM có nhiều tham số hơn do có các cổng và các ô, nên việc cập nhật cũng sẽ nhiều hơn:

  • Trọng số và bias của cổng quên (Wf,bfW_f, b_f)
  • Trọng số và bias của cổng nhập (Wi,bi,WC,bCW_i, b_i, W_C, b_C)
  • Trọng số và bias của cổng xuất (Wo,boW_o, b_o)

Do số lượng tham số nhiều như vậy nên LSTM thường cần nhiều tài nguyên tính toán hơn RNN.

3.5 Gradient cụ thể cho từng tham số của LSTM

Ta sử dụng quy tắc chuỗi (Chain rule) để lan truyền ngược gradient của hàm mất mát LL qua các bước thời gian. Gradient của LL ảnh hưởng đối với từng tham số cho đến các cổng và trạng thái ô. Vì yêu cầu của từng bài toán khác nhau nên LL sẽ được tính tùy theo đề bài.

3.5.1 Gradient của trạng thái ẩn và trạng thái ô

Gradient của hth_t

Lht\frac{\partial L}{\partial h_t}

Gradient của CtC_t

ht=ottanh(Ct) htCt=ot(1tanh2(Ct))h_t = o_t \cdot \tanh(C_t) \implies \frac{\partial h_t}{\partial C_t} = o_t \cdot (1 - \tanh^2(C_t))

LCt=LhthtCt=Lhtot(1tanh2(Ct))\frac{\partial L}{\partial C_t} = \frac{\partial L}{\partial h_t} \cdot \frac{\partial h_t}{\partial C_t} = \frac{\partial L}{\partial h_t} \cdot o_t \cdot (1 - \tanh^2(C_t))

Gradient của oto_t

htot=tanh(Ct)\frac{\partial h_t}{\partial o_t} = \tanh(C_t)

Lot=Lhttanh(Ct)\frac{\partial L}{\partial o_t} = \frac{\partial L}{\partial h_t} \cdot \tanh(C_t)

3.5.2 Gradient của cổng xuất (Wo,boW_o, b_o)

Từ lúc này, nhiều chỗ mình sẽ để zt=Wo[ht1,xt]z_t = W_o \cdot [h_{t-1}, x_t] để cho gọn nhé

Gradient của oto_t

ot=σ(Wo[ht1,xt]+bo) ot(Wo[ht1,xt]+bo)=ot(1ot)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) \implies \frac{\partial o_t}{\partial (W_o \cdot [h_{t-1}, x_t] + b_o)} = o_t \cdot (1 - o_t)

Lý do là vì ta có hàm sigmoid có công thức: σ(z)=11+ez\sigma(z) = \frac{1}{1 + e^{-z}}

dσ(z)dz=σ(z)(1σ(z))\frac{d\sigma(z)}{dz} = \sigma(z) \cdot (1 - \sigma(z))

ot=σ(zt)o_t = \sigma(z_t)

Gradient đối với WoW_o

LWo=Lotot(Wo[ht1,xt])(Wo[ht1,xt])Wo\frac{\partial L}{\partial W_o} = \frac{\partial L}{\partial o_t} \cdot \frac{\partial o_t}{\partial (W_o \cdot [h_{t-1}, x_t])} \cdot \frac{\partial (W_o \cdot [h_{t-1}, x_t])}{\partial W_o}

Mà:

htot=tanh(Ct) Lot=Lhthtot=Lhttanh(Ct)\frac{\partial h_t}{\partial o_t} = \tanh(C_t) \implies \frac{\partial L}{\partial o_t} = \frac{\partial L}{\partial h_t} \cdot \frac{\partial h_t}{\partial o_t} = \frac{\partial L}{\partial h_t} \cdot \tanh(C_t)

dσ(z)dz=σ(z)(1σ(z))\frac{d\sigma(z)}{dz} = \sigma(z) \cdot (1 - \sigma(z))

(Wo[ht1,xt])Wo=[ht1,xt]T(Duˋng chain-rule)\frac{\partial (W_o \cdot [h_{t-1}, x_t])}{\partial W_o} = [h_{t-1}, x_t]^T \quad (\text{Dùng chain-rule})

Nên:

LWo=(Lhttanh(Ct))ot(1ot)[ht1,xt]T\frac{\partial L}{\partial W_o} = \left( \frac{\partial L}{\partial h_t} \cdot \tanh(C_t) \right) \cdot o_t \cdot (1 - o_t) \cdot [h_{t-1}, x_t]^T

Kết quả sẽ là ma trận (dh,dh+dx)(d_h, d_h + d_x) (dhd_h là số chiều của hidden state, dxd_x là số chiều của input vector).

Gradient đối với bob_o:

Lbo=Lototztztbo=Lhttanh(Ct)ot(1ot)\frac{\partial L}{\partial b_o} = \frac{\partial L}{\partial o_t} \cdot \frac{\partial o_t}{\partial z_t} \cdot \frac{\partial z_t}{\partial b_o} = \frac{\partial L}{\partial h_t} \cdot \tanh(C_t) \cdot o_t \cdot (1 - o_t)

Kết quả là vector dhd_h

3.5.3 Gradient của trạng thái ô trước (Ct1C_{t-1}) và các cổng khác

Gradient của cổng quên (ftf_t)

Ctft=Ct1\frac{\partial C_t}{\partial f_t} = C_{t-1}

Lft=LCtCt1\frac{\partial L}{\partial f_t} = \frac{\partial L}{\partial C_t} \cdot C_{t-1}

Gradient đối với Wf,bfW_f, b_f

ft=σ(Wf[ht1,xt]+bf) ft(Wf[ht1,xt]+bf)=ft(1ft)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \implies \frac{\partial f_t}{\partial (W_f \cdot [h_{t-1}, x_t] + b_f)} = f_t \cdot (1 - f_t)

LWf=(LCtCt1)ft(1ft)[ht1,xt]T\frac{\partial L}{\partial W_f} = \left( \frac{\partial L}{\partial C_t} \cdot C_{t-1} \right) \cdot f_t \cdot (1 - f_t) \cdot [h_{t-1}, x_t]^T

Lbf=(LCtCt1)(ft(1ft))\frac{\partial L}{\partial b_f} = \left( \frac{\partial L}{\partial C_t} \cdot C_{t-1} \right) \cdot (f_t \cdot (1 - f_t))

Gradient của cổng nhập (iti_t) và giá trị ứng viên (C~t\tilde{C}_t)

Ctit=C~t,CtC~t=it\frac{\partial C_t}{\partial i_t} = \tilde{C}_t, \quad \frac{\partial C_t}{\partial \tilde{C}_t} = i_t

Lit=LCtC~t,LC~t=LCtit\frac{\partial L}{\partial i_t} = \frac{\partial L}{\partial C_t} \cdot \tilde{C}_t, \quad \frac{\partial L}{\partial \tilde{C}_t} = \frac{\partial L}{\partial C_t} \cdot i_t

Gradient đối với Wi,biW_i, b_i

it=σ(Wi[ht1,xt]+bi) it(Wi[ht1,xt]+bi)=it(1it)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \implies \frac{\partial i_t}{\partial (W_i \cdot [h_{t-1}, x_t] + b_i)} = i_t \cdot (1 - i_t)

LWi=(LCtC~t)(it(1it))[ht1,xt]T\frac{\partial L}{\partial W_i} = \left( \frac{\partial L}{\partial C_t} \cdot \tilde{C}t \right) \cdot (i_t \cdot (1 - i_t)) \cdot [h{t-1}, x_t]^T

Lbi=(LCtC~t)(it(1it))\frac{\partial L}{\partial b_i} = \left( \frac{\partial L}{\partial C_t} \cdot \tilde{C}_t \right) \cdot (i_t \cdot (1 - i_t))

Gradient đối với WC,bCW_C, b_C

C~t=tanh(WC[ht1,xt]+bC) C~t(WC[ht1,xt]+bC)=1C~t2\tilde{C}t = \tanh(W_C \cdot [h{t-1}, x_t] + b_C) \implies \frac{\partial \tilde{C}t}{\partial (W_C \cdot [h{t-1}, x_t] + b_C)} = 1 - \tilde{C}_t^2

LWC=(LCtit)(1C~t2)[ht1,xt]T\frac{\partial L}{\partial W_C} = \left( \frac{\partial L}{\partial C_t} \cdot i_t \right) \cdot (1 - \tilde{C}t^2) \cdot [h{t-1}, x_t]^T

LbC=(LCtit)(1C~t2)\frac{\partial L}{\partial b_C} = \left( \frac{\partial L}{\partial C_t} \cdot i_t \right) \cdot (1 - \tilde{C}_t^2)

####3.5.4 Gradient truyền ngược qua thời gian

Gradient của ht1h_{t-1}xtx_t

Mỗi cổng (ft,it,C~t,otf_t, i_t, \tilde{C}t, o_t) đều phụ thuộc vào [ht1,xt][h{t-1}, x_t], nên gradient đối với ht1h_{t-1} là tổng đóng góp từ tất cả các cổng:

Lht1=gft,it,C~t,ot(Lgg(Wg[ht1,xt])Wght1)\frac{\partial L}{\partial h_{t-1}} = \sum_{g \in {f_t, i_t, \tilde{C}t, o_t}} \left( \frac{\partial L}{\partial g} \cdot \frac{\partial g}{\partial (W_g \cdot [h{t-1}, x_t])} \cdot W_g^{h_{t-1}} \right)

Trong đó Wght1W_g^{h_{t-1}} là phần của ma trận WgW_g tương ứng với ht1h_{t-1}. Gradient này sẽ được truyền ngược về các bước trước (t1,t2,t-1, t-2, \ldots).

3.6 Các điểm cần lưu ý khi huấn luyện LSTM

  • Khởi tạo tham số: Trọng số và bias thường được khởi tạo ngẫu nhiên hoặc sử dụng kỹ thuật như Xavier initialization. Bias của cổng quên đôi khi được khởi tạo lớn hơn (ví dụ: 1.0) để khuyến khích giữ thông tin ban đầu.
  • Gradient Clipping: Để tránh bùng nổ gradient, gradient thường được cắt nếu vượt quá một ngưỡng).
  • Tính toán phức tạp: Do LSTM có nhiều tham số, việc tính gradient thủ công rất phức tạp. Trong thực tế, các framework như TensorFlow hoặc PyTorch tự động tính gradient bằng autograd.
  • Chuẩn hóa gradient (Gradient Clipping): Để tránh bùng nổ gradient, gradient thường được cắt (clip) nếu vượt quá ngưỡng nhất định.
  • Chuẩn bị dữ liệu:
    • Dữ liệu chuỗi cần được xử lý thành các batch với độ dài cố định hoặc sử dụng padding cho các chuỗi có độ dài khác nhau.
    • Với bài toán như NLP, đầu vào xtx_t thường là các vector embedding (như Word2Vec, GloVe).
  • Tối ưu hóa siêu tham số: Learning rate, số đơn vị LSTM, số lớp (layers), và kích thước batch cần được điều chỉnh cẩn thận để đạt hiệu quả tốt.

Đoạn kết

Vậy là chúng mình đã đi hết LSTM, một mô hình RNN cải tiến, tuy giải quyết khá tốt vấn đề bùng nổ gradient hoặc vanishing gradient, tuy nhiên do phải tính toán khá nhiều, nên là bài viết sau mình sẽ giới thiệu cho mọi người về Transformer.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tấn công và phòng thủ bậc nhất cực mạnh cho các mô hình học máy

tấn công bậc nhất cực mạnh = universal first-order adversary. Update: Bleeding edge của CleverHans đã lên từ 3.1.0 đến 4.

0 0 45

- vừa được xem lúc

[Deep Learning] Key Information Extraction from document using Graph Convolution Network - Bài toán trích rút thông tin từ hóa đơn với Graph Convolution Network

Các nội dung sẽ được đề cập trong bài blog lần này. . Tổng quan về GNN, GCN. Bài toán Key Information Extraction, trích rút thông tin trong văn bản từ ảnh.

0 0 231

- vừa được xem lúc

Trích xuất thông tin bảng biểu cực đơn giản với OpenCV

Trong thời điểm nhà nước đang thúc đẩy mạnh mẽ quá trình chuyển đổi số như hiện nay, Document Understanding nói chung cũng như Table Extraction nói riêng đang trở thành một trong những lĩnh vực được quan tâm phát triển và chú trọng hàng đầu. Vậy Table Extraction là gì? Document Understanding là cái

0 0 239

- vừa được xem lúc

Con đường AI của tôi

Gần đây, khá nhiều bạn nhắn tin hỏi mình những câu hỏi đại loại như: có nên học AI, bắt đầu học AI như nào, làm sao tự học cho đúng, cho nhanh, học không bị nản, lộ trình học AI như nào... Sau nhiều lần trả lời, mình nghĩ rằng nên viết hẳn một bài để trả lời chi tiết hơn, cũng như để các bạn sau này

0 0 166

- vừa được xem lúc

[B5'] Smooth Adversarial Training

Đây là một bài trong series Báo khoa học trong vòng 5 phút. Được viết bởi Xie et. al, John Hopkins University, trong khi đang intern tại Google. Hiện vẫn là preprint do bị reject tại ICLR 2021.

0 0 49

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 157