深度學習系列 | Seq2Seq端到端翻譯模型

一、通俗總結

Seq2Seq 就像一個 “序列轉換器”:先把輸入的一段話 “壓縮成一個核心意思”,再根據這個意思 “一句句生成另一段話”,能搞定翻譯、聽寫這類 “輸入輸出不一樣長” 的任務,但太長的內容可能記不全,還容易越錯越離譜。

二、拆解知識步驟

1. 由來的背景

傳統序列模型(如 RNN)只能處理 “輸入輸出長度固定” 或 “等長” 的任務(如文本分類、情感分析),但現實中很多任務需要 “不等長序列轉換”:

  • 機器翻譯:輸入中文句子(長度 5)→ 輸出英文句子(長度 7)
  • 語音轉文字:輸入音頻序列(時長 3 秒)→ 輸出文字序列(長度 10)
  • 問答系統:輸入問題(長度 8)→ 輸出答案(長度 5)
    這些場景下,需要一種能 “吃進一個序列,吐出另一個長度不同的序列” 的模型,Seq2Seq 由此被提出(2014 年由 Google 團隊提出)。

2. 目標及解決的問題

  • 目標:實現 “任意長度輸入序列→任意長度輸出序列” 的端到端轉換,無需人工設計特征。
  • 解決的問題:
    • 解決 “輸入輸出長度不固定” 的問題:突破傳統模型對序列長度的限制。
    • 解決 “序列依賴捕捉” 的問題:通過編碼器逐詞處理輸入,捕捉詞與詞的時序關系(如 “機器學習” 中 “機器” 和 “學習” 的關聯)。
    • 解決 “跨模態轉換” 的問題:支持文本→文本(翻譯)、語音→文本(聽寫)、文本→語音(合成)等跨類型序列轉換。

3. 怎么實現的

我們看seq2seq做了干了什么事情? seq2seq模型的輸入可以是一個 (單詞、字母或者圖像特征) 序列, 輸出是另外一個(單詞、字母或者圖像特征) 序列, 一個訓練好的seq2seq模型如下圖所示 :

如下圖所示,以NLP中的機器翻譯任務為例, 序列指的是一連串的單詞, 輸出也是一連串的單詞

將上圖藍色的模型進行拆解, 如下圖所示: seq2seq模型由編碼器(Encoder) 和解碼器(Decoder) 組成。綠色的編碼器會處理輸入序列中的每個元素并獲得輸入信息,這些信息會被轉換成為一個黃色的向量(稱為context向量)。當我們處理完整個輸入序列后,編碼器把 context向量 發送給紫色的解碼器,解碼器通過context向量中的信息,逐個元素輸出新的序列。

在機器翻譯任務中,seq2seq模型實現翻譯的過程如下圖所示。seq2seq模型中的編碼器和解碼器一般采用的是循環神經網絡RNN,編碼器將輸入的法語單詞序列編碼成context向量(在綠色encoder和紫色decoder中間出現),然后解碼器根據context向量解碼出英語單詞序列

我們來看一下黃色的context向量是什么?本質上是一組浮點數。而這個context的數組長度是基于編碼器RNN的隱藏層神經元數量的。下圖展示了長度為4的context向量,但在實際應用中,context向量的長度是自定義的,比如可能是256,512或者1024.

我們再找個生活中的案例做對比, “翻譯官工作流程”:

階段 1:編碼器(理解輸入)
  • 角色:像 “翻譯官聽原文”,逐詞 “閱讀” 輸入序列(如中文句子),每一步記住當前詞和之前的內容,最終把整段話的意思壓縮成一個 “核心記憶”(上下文向量c)。
  • 工具:常用 LSTM/GRU(帶門控機制的 RNN),避免長序列信息丟失(比普通 RNN 更擅長記住早期內容)。
階段 2:解碼器(生成輸出)
  • 角色:像 “翻譯官說譯文”,基于編碼器的 “核心記憶”(c),從第一個詞開始,結合已說的內容,逐詞生成輸出序列(如英文句子)。
  • 邏輯:生成每個詞時,既要參考 “核心記憶”(確保不偏離原文意思),又要參考已生成的詞(確保句子通順,如生成 “love” 后,更可能接 “machine learning” 而非 “cat”)。

4. 局限性

  • 信息瓶頸:上下文向量c是固定長度(如 512 維),當輸入序列過長(如 100 詞以上),早期信息會被 “壓縮丟失”(類似翻譯官記不住長句子的開頭)。
  • 累積錯誤:解碼器生成依賴上一個詞,若某一步錯了(如把 “機器學習” 譯成 “machine study”),后續會跟著錯(類似翻譯錯一個詞,后面全跑偏)。
  • 無法并行:編碼器和解碼器都是 “逐詞處理”(時序依賴),訓練速度慢(比 Transformer 慢 8-10 倍)。
  • 雙向信息缺失:編碼器雖能看全輸入,但解碼器生成時只能看已生成的詞(單向),難以修正全局錯誤(如翻譯 “我不吃肉”,先譯 “I don't eat”,后面很難再補 “meat” 而非 “fish”)。

三、數學表達式及含義

四、Attention的引入

引入注意力機制前, 看看前文說的局限性后, 再思考兩個問題:

  • 1、 seq2seq模型處理長文本序列有哪些難點?
  • 2、 基于RNN的seq2seq模型如何結合attention來解決問題1 并提升模型效果?

基于RNN的seq2seq模型編碼器所有信息都編碼到了一個context向量中,便是這類模型的瓶頸。一方面單個向量很難包含所有文本序列的信息,另一方面RNN遞歸地編碼文本序列使得模型在處理長文本時面臨非常大的挑戰(比如RNN處理到第500個單詞的時候,很難再包含1-499個單詞中的所有信息了)。

面對上面的問題, Bahdanau等2014發布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年發布的Effective Approaches to Attention-based Neural Machine Translation 兩篇論文中提出了一種叫做注意力attetion的技術。通過attention技術,seq2seq模型極大地提高了機器翻譯的質量。歸其原因是:attention注意力機制,使得seq2seq模型可以有區分度、有重點地關注輸入序列。


讓我們繼續來理解帶有注意力的seq2seq模型:一個注意力模型與經典的seq2seq模型主要有2點不同:

1、首先,編碼器會把更多的數據傳遞給解碼器。編碼器把所有時間步的hidden state(隱藏層狀態)傳遞給解碼器,而不是只傳遞最后一個hidden state(隱藏層狀態),如下面的動態圖所示:

2、注意力模型的解碼器在產生輸出之前,做了一個額外的attention處理。如下圖所示,具體為:

  1. 由于編碼器中每個hidden state(隱藏層狀態)都對應到輸入句子中一個單詞,那么解碼器要查看所有接收到的編碼器的hidden state(隱藏層狀態)。
  2. 給每個hidden state(隱藏層狀態)計算出一個分數(我們先忽略這個分數的計算過程)。
  3. 所有hidden state(隱藏層狀態)的分數經過softmax進行歸一化。
  4. 將每個hidden state(隱藏層狀態)乘以所對應的分數,從而能夠讓高分對應的 hidden state(隱藏層狀態)會被放大,而低分對應的hidden state(隱藏層狀態)會被縮小。
  5. 將所有hidden state根據對應分數進行加權求和,得到對應時間步的context向量。

所以,attention可以簡單理解為:一種有效的加權求和技術,其藝術在于如何獲得權重。


現在,讓我們把所有內容都融合到下面的圖中,來看看結合注意力的seq2seq模型解碼器全流程,動態圖展示的是第4個時間步:

  1. 注意力模型的解碼器 RNN 的輸入包括:一個word embedding 向量,和一個初始化好的解碼器 hidden state,圖中是 h_init 。
  2. RNN 處理上述的 2 個輸入,產生一個輸出和一個新的 hidden state,圖中為 h_4 。
  3. 注意力的步驟:我們使用編碼器的所有 hidden state向量和 h_4 向量來計算這個時間步的context向量( C_4 )。
  4. 再把 h_4 和 C_4 拼接起來,得到一個橙色向量。
  5. 我們把這個橙色向量輸入一個前饋神經網絡(這個網絡是和整個模型一起訓練的)。
  6. 根據前饋神經網絡的輸出向量得到輸出單詞:假設輸出序列可能的單詞有 N 個,那么這個前饋神經網絡的輸出向量通常是 N 維的,每個維度的下標對應一個輸出單詞,每個維度的數值對應的是該單詞的輸出概率。
  7. 在下一個時間步重復1-6步驟。

最后,我們可視化一下注意力機制,看看在解碼器在每個時間步關注了輸入序列的哪些部分

需要注意的是:注意力模型不是無意識地把輸出的第一個單詞對應到輸入的第一個單詞,它是在訓練階段學習到如何對兩種語言的單詞進行對應(在本文的例子中,是法語和英語)

該知識點的學習為我們后續學習Transformer打下堅實的基礎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95234.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring MVC BOOT 中體現的設計模式

Spring:創建型:單例模式:Bean默認就是單例的,是餓漢模式的,但是可以通過Lazy設置為懶漢工廠模式:可自定義FactroyBean,實現Bean自己的生產工廠結構型:代理模式:AOP就是典型的動態代理,有jdk和cglib兩種實現…

Chrome瀏覽器調用ActiveX控件之allWebOffice在線編輯控件

背景 allWebOffice控件能夠實現在瀏覽器窗口中在線操作文檔的應用(閱讀、編輯、保存等),支持編輯文檔時保留修改痕跡,支持書簽位置內容動態填充,支持公文套紅,支持文檔保護控制等諸多辦公功能,本…

嵌入式 - 硬件:51單片機

本節重點1. MCU、CPU、GPU、NPU、SOC、MPU、FPU2. 內存、外存的區別3. RAM和ROM的區別,單片機RAM大小4. 三大總線及其特點5. 發光二極管分類及其特點6. 數碼管顯示原理一、嵌入式以應用為中心,以計算機技術為基礎,軟硬件可裁剪的專用計算機系…

Java Spring Boot 中 Redis 緩存穿透問題排查與解決方案

前言 作為一名普通的 Java 程序開發者,日常開發中難免會遇到一些看似簡單但實際排查起來非常棘手的問題。在最近的一個項目中,我遇到了一個 Redis 緩存穿透的問題,導致系統在高并發下性能急劇下降,甚至出現服務響應超時的情況。這…

Ubuntu下配置并遠程連接MySQL

1、安裝mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、啟動并設置服務為開機自啟動systemctl enable mysql.service --now4、查看服務狀態systemct…

開源 C++ QT Widget 開發(九)圖表--儀表盤

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 C QT Widget 開發(一)工程文件結構-CSDN博客 開源…

怎么為服務器設置或重置服務器密碼?

創建服務器后,您可以設置服務器的登錄密碼,如果你忘記了密碼,可以重新設置實例的密碼。本文講一下如何重置阿里云服務器密碼。使用限制:離線重置密碼僅支持在控制臺設置或重置服務器管理員賬號的密碼。?Windows 實例的默認用戶名…

【線性代數入門 | 那忘算8】洛谷P3389 高斯消元(內附行列式教學)

想了想還是單開了一篇,數學王子值得! 專欄指路:《再來一遍一定記住的算法(那些你可能忘記了的算法)》 前置知識: 矩陣:數的集合,一般是方程的系數。 題面: 洛谷P3389 …

GEM5學習(3):如何快速創建一個組件

通過一個圖并行計算的測試用例,來學習如何快速構建一個目標組件 其核心思想是通過繼承現有組件再拓展自定義參數 創建腳本 如何創建腳本,具體還可以看官方說明:gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

數據血緣中的圖數據庫如何選擇

Neo4j 和 ArangoDB 都是非常優秀的圖數據庫,但它們的設計哲學、核心架構和適用場景有顯著的區別。 簡單來說,核心區別在于: Neo4j 是原生圖數據庫,專為處理圖數據和圖查詢而設計和優化。ArangoDB 是多模型數據庫,同時支…

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線 你已經能用 PowerShell 解決很多日常問題了。接下來最重要的,就是把零散命令升級為可復用的工具,并在真實場景中不斷打磨。 一、為什么下一步是“工具化(Toolmaking)” 當任務開始“重復、多人用、可移…

C++編程語言:標準庫:第37章——正則表達式(Bjarne Stroustrup)

第 37章 正則表達式(Regular Expressions) 目錄 37.1 正則表達式(規范表達式)(Regular Expressions) 37.1.1 正則表達式相關符號(Regular Express Notation) 37.2 regex 37.2.1 匹配結果(Match Results) 37.2.2 格式化(Formatting) 37.3 正則表達式函數 37.3.1 …

sciml包scixgboost函數發布,輕松完成機器學習xgboost分析

Xgboost是Boosting算法的其中一種,Boosting算法的思想是將許多弱分類器集成在一起,形成一個強分類器。因為Xgboost是一種提升樹模型,所以它是將許多樹模型集成在一起,形成一個很強的分類器。 我目前整合了多個R包,編寫…

Ubuntu中配置JMmeter工具

1、檢查是否已安裝Java 環境java -version若未安裝,執行以下命令安裝 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下載JMeter壓縮包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz將下載的…

LeetCode 925.長按鍵入

你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字符 c 時,按鍵可能會被長按,而字符可能被輸入 1 次或多次。 你將會檢查鍵盤輸入的字符 typed。如果它對應的可能是你的朋友的名字(其中一些字符可能被長按)&#…

9.3 模擬

lc190 顛倒二進制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai對話機器人

ESP-IDF 環境搭建與問題解決 下載與安裝 ESP-IDF 官方下載地址&#xff1a;https://dl.espressif.com/dl/esp-idf建議使用穩定版本&#xff0c;避免開發版可能存在的兼容性問題 中文編碼問題解決方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…

11.類與對象

目錄 1. 創建類與對象示例 1.1 __init__ 初始化器: 1.2 __new__構造器 1.3 什么時候需要重寫 __new__? 1.4 init和new對比 2. 屬性 2.1 實例屬性 2.2 類屬性 3. 作用域命名約定 3.1 非公共屬性 3.2 公共屬性 3.3 名稱修飾 3.4 一眼看懂三種“可見性” 4. 方法 …

【js】Promise.try VS try-catch

前言JavaScript 正為 Promise 添加一個新的方法&#xff0c;使得處理異步函數更加清晰和安全。Promise.try 允許將任何函數包裝在 Promise 中&#xff0c;無論它是否異步。使用 Promise.try 可避免傳統 try/catch 結構與 Promise 鏈的混合使用&#xff0c;代碼更簡潔。try-catc…

MySQL-表的約束(上)

表的約束在 MySQL 中&#xff0c;表的約束&#xff08;Constraints&#xff09;用于確保數據庫中數據的完整性和一致性。它們定義了對表中數據的規則和限制&#xff0c;防止無效或不一致的數據被插入、更新或刪除。常見的 MySQL 表約束包括主鍵約束&#xff08;PRIMARY KEY&…