深度學習處理文本(13)

我們使用基于GRU的編碼器和解碼器來在Keras中實現這一方法。選擇GRU而不是LSTM,會讓事情變得簡單一些,因為GRU只有一個狀態向量,而LSTM有多個狀態向量。首先是編碼器,如代碼清單11-28所示。

代碼清單11-28 基于GRU的編碼器

from tensorflow import keras
from tensorflow.keras import layersembed_dim = 256
latent_dim = 1024source = keras.Input(shape=(None,), dtype="int64", name="english")----不要忘記掩碼,它對這種方法來說很重要
x = layers.Embedding(vocab_size, embed_dim, mask_zero=True)(source)----這是英語源句子。指定輸入名稱,我們就可以用輸入組成的字典來擬合模型
encoded_source = layers.Bidirectional(layers.GRU(latent_dim), merge_mode="sum")(x)----編碼后的源句子即為雙向GRU的最后一個輸出

接下來,我們來添加解碼器——一個簡單的GRU層,其初始狀態為編碼后的源句子。我們再添加一個Dense層,為每個輸出時間步生成一個在西班牙語詞表上的概率分布,如代碼清單11-29所示。

代碼清單11-29 基于GRU的解碼器與端到端模型

past_target = keras.Input(shape=(None,), dtype="int64", name="spanish")----這是西班牙語目標句子
x = layers.Embedding(vocab_size, embed_dim, mask_zero=True)(past_target)----不要忘記使用掩碼
decoder_gru = layers.GRU(latent_dim, return_sequences=True)
x = decoder_gru(x, initial_state=encoded_source)----編碼后的源句子作為解碼器GRU的初始狀態
x = layers.Dropout(0.5)(x)
target_next_step = layers.Dense(vocab_size, activation="softmax")(x)----預測下一個詞元
seq2seq_rnn = keras.Model([source, past_target], target_next_step)----端到端模型:將源句子和目標句子映射為偏移一個時間步的目標句子

訓練過程中,解碼器接收整個目標序列作為輸入,但由于RNN逐步處理的性質,它將僅通過查看輸入中第0~N個詞元來預測輸出的第N個詞元(對應于句子的下一個詞元,因為輸出需要偏移一個時間步)?。這意味著我們只能使用過去的信息來預測未來——我們也應該這樣做,否則就是在作弊,這樣生成模型在推斷過程中將不會生效。下面開始訓練模型,如代碼清單11-30所示。

代碼清單11-30 訓練序列到序列循環模型

seq2seq_rnn.compile(optimizer="rmsprop",loss="sparse_categorical_crossentropy",metrics=["accuracy"])
seq2seq_rnn.fit(train_ds, epochs=15, validation_data=val_ds)

我們選擇精度來粗略監控訓練過程中的驗證集性能。模型精度為64%,也就是說,平均而言,該模型在64%的時間里正確預測了西班牙語句子的下一個單詞。然而在實踐中,對于機器翻譯模型而言,下一個詞元精度并不是一個很好的指標,因為它會假設:在預測第N+1個詞元時,已經知道了從0到N的正確的目標詞元。實際上,在推斷過程中,你需要從頭開始生成目標句子,不能認為前面生成的詞元都是100%正確的。現實世界中的機器翻譯系統可能會使用“BLEU分數”來評估模型。這個指標會評估整個生成序列,并且看起來與人類對翻譯質量的評估密切相關。最后,我們使用模型進行推斷,如代碼清單11-31所示。我們從測試集中挑選幾個句子,并觀察模型如何翻譯它們。我們首先將種子詞元"[start]“與編碼后的英文源句子一起輸入解碼器模型。我們得到下一個詞元的預測結果,并不斷將其重新輸入解碼器,每次迭代都采樣一個新的目標詞元,直到遇到”[end]"或達到句子的最大長度。

代碼清單11-31 利用RNN編碼器和RNN解碼器來翻譯新句子

import numpy as np
spa_vocab = target_vectorization.get_vocabulary()---- (本行及以下1)準備一個字典,將詞元索引預測值映射為字符串詞元
spa_index_lookup = dict(zip(range(len(spa_vocab)), spa_vocab))
max_decoded_sentence_length = 20def decode_sequence(input_sentence):tokenized_input_sentence = source_vectorization([input_sentence])decoded_sentence = "[start]"----種子詞元for i in range(max_decoded_sentence_length):tokenized_target_sentence = target_vectorization([decoded_sentence])next_token_predictions = seq2seq_rnn.predict(---- (本行及以下2)對下一個詞元進行采樣[tokenized_input_sentence, tokenized_target_sentence])sampled_token_index = np.argmax(next_token_predictions[0, i, :])sampled_token = spa_index_lookup[sampled_token_index]---- (本行及以下1)將下一個詞元預測值轉換為字符串,并添加到生成的句子中decoded_sentence += " " + sampled_tokenif sampled_token == "[end]":----退出條件:達到最大長度或遇到停止詞元breakreturn decoded_sentencetest_eng_texts = [pair[0] for pair in test_pairs]
for _ in range(20):input_sentence = random.choice(test_eng_texts)print("-")print(input_sentence)print(decode_sequence(input_sentence))

請注意,這種推斷方法雖然非常簡單,但效率很低,因為每次采樣新詞時,都需要重新處理整個源句子和生成的整個目標句子。在實際應用中,你會將編碼器和解碼器分成兩個獨立的模型,在每次采樣詞元時,解碼器只運行一步,并重新使用之前的內部狀態。翻譯結果如代碼清單11-32所示。對于一個玩具模型而言,這個模型的效果相當好,盡管它仍然會犯許多低級錯誤。

代碼清單11-32 循環翻譯模型的一些結果示例

Who is in this room?
[start] quién está en esta habitación [end]
-
That doesn't sound too dangerous.
[start] eso no es muy difícil [end]
-
No one will stop me.
[start] nadie me va a hacer [end]
-
Tom is friendly.
[start] tom es un buen [UNK] [end]

有很多方法可以改進這個玩具模型。編碼器和解碼器可以使用多個循環層堆疊(請注意,對于解碼器來說,這會使狀態管理變得更加復雜)?,我們還可以使用LSTM代替GRU,諸如此類。然而,除了這些調整,RNN序列到序列學習方法還受到一些根本性的限制。源序列表示必須完整保存在編碼器狀態向量中,這極大地限制了待翻譯句子的長度和復雜度。這有點像一個人完全憑記憶翻譯一句話,并且在翻譯時只能看一次源句子。RNN很難處理非常長的序列,因為它會逐漸忘記過去。等到處理序列中的第100個詞元時,模型關于序列開始的信息已經幾乎沒有了。這意味著基于RNN的模型無法保存長期上下文,而這對于翻譯長文檔而言至關重要。正是由于這些限制,機器學習領域才采用Transformer架構來解決序列到序列問題。我們來看一下。

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

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

相關文章

HashMap 底層原理詳解

1. 核心數據結構 JDK 1.7 及之前&#xff1a;數組 鏈表 JDK 1.8 及之后&#xff1a;數組 鏈表/紅黑樹&#xff08;鏈表長度 ≥8 時轉紅黑樹&#xff0c;≤6 時退化為鏈表&#xff09; // JDK 1.8 的 Node 定義&#xff08;鏈表節點&#xff09; static class Node<K,V&g…

使用MySQL時出現 Ignoring query to other database 錯誤

Ignoring query to other database 錯誤 當在遠程連接軟件中輸入MySQL命令出現該錯誤 導致錯誤原因是&#xff1a;登錄mysql時賬戶名沒有加上u 如果出現該錯誤&#xff0c;退出mysql&#xff0c;重新輸入正確格式進入即可&#xff01;

哈爾濱工業大學:大模型時代的具身智能

大家好&#xff0c;我是櫻木。 機器人在工業領域&#xff0c;已經逐漸成熟。具身容易&#xff0c;智能難。 機器人-》智能機器人&#xff0c;需要自主能力&#xff0c;加上通用能力。 智能機器人-》人類&#xff0c;這個階段就太有想象空間了。而最受關注的-類人機器人。 如何…

Javascript代碼壓縮混淆工具terser詳解

原始的JavaScript代碼在正式的服務器上,如果沒有進行壓縮,混淆,不僅加載速度比較慢,而且還存在安全和性能問題. 因此現在需要進行壓縮,混淆處理. 處理方案簡單描述一下: 1. 使用 terser 工具進行 安裝 terser工具: # npm 安裝 npm install terser --save-dev# 或使用 yarn 安…

Java String 常用方法詳解

目錄 一、獲取字符串信息(一)獲取字符串長度(二)獲取指定索引處的字符(三)獲取子字符串二、字符串比較(一)比較字符串內容(二)忽略大小寫比較三、字符串轉換(一)轉換為大寫(二)轉換為小寫四、字符串查找(一)查找子字符串的位置(二)從指定位置開始查找五、字符…

Linux驅動開發練習案例

1 開發目標 1.1 架構圖 操作系統&#xff1a;基于Linux5.10.10源碼和STM32MP157開發板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驅動層&#xff1a;為每個外設配置DTS并且單獨封裝外設驅動模塊。其中電壓ADC測試&#xff0c;采用linux內核…

leetcode-代碼隨想錄-哈希表-贖金信

題目 題目鏈接&#xff1a;383. 贖金信 - 力扣&#xff08;LeetCode&#xff09; 給你兩個字符串&#xff1a;ransomNote 和 magazine &#xff0c;判斷 ransomNote 能不能由 magazine 里面的字符構成。 如果可以&#xff0c;返回 true &#xff1b;否則返回 false 。 maga…

精品可編輯PPT | “新基建”在數字化智慧高速公路中的支撐應用方案智慧建筑智慧交通解決方案施工行業解決方案

本文詳細闡述了“新基建”在數字化智慧高速公路中的支撐應用方案&#xff0c;從政策背景出發&#xff0c;指出國家在交通領域的一系列發展規劃和指導意見&#xff0c;強調了智慧交通建設的重要性。分析了當前高速公路存在的問題&#xff0c;如基礎感知設施不足、協同水平低、服…

C語言求3到100之間的素數

一、代碼展示 二、運行結果 三、感悟思考 注意: 這個題思路他是一個試除法的一個思路 先進入一個for循環 遍歷3到100之間的數字 第二個for循環則是 判斷他不是素數 那么就直接退出 這里用break 是素數就打印出來 在第一個for循環內 第二個for循環外

英語—四級CET4考試—蒙猜篇—匹配題

蒙猜方法一 匹配題的做題&#xff1a; 方法一&#xff1a; 首先&#xff0c;什么都不想&#xff0c;把問題中ing形式的&#xff0c;大寫字母的&#xff0c;人名&#xff0c;地名&#xff0c;最后幾個依次框起來。 然后&#xff0c;比如46題&#xff0c;口里默念meaningful lif…

股票日數據使用_未復權日數據生成前復權日周月季年數據

目錄 前置&#xff1a; 準備 代碼&#xff1a;數據庫交互部分 代碼&#xff1a;生成前復權 日、周、月、季、年數據 前置&#xff1a; 1 未復權日數據獲取&#xff0c;請查看 https://blog.csdn.net/m0_37967652/article/details/146435589 數據庫使用PostgreSQL。更新日…

系統與網絡安全------Windows系統安全(6)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 共享文件夾 發布共享文件夾 Windows共享概述 微軟公司推出的網絡文件/打印機服務系統 可以將一臺主機的資源發布給其他主機共有 共享訪問的優點 方便、快捷相比光盤 U盤不易受文件大小限制 可以實現訪問…

BN 層的作用, 為什么有這個作用?

BN 層&#xff08;Batch Normalization&#xff09;——這是深度神經網絡中非常重要的一環&#xff0c;它大大改善了網絡的訓練速度、穩定性和收斂效果。 &#x1f9e0; 一句話理解 BN 層的作用&#xff1a; Batch Normalization&#xff08;批歸一化&#xff09;通過標準化每一…

判斷HiveQL語句為ALTER TABLE語句的識別函數

寫一個C#字符串解析程序代碼&#xff0c;邏輯是從前到后一個一個讀取字符&#xff0c;遇到匹配空格、Tab和換行符就繼續讀取下一個字符&#xff0c;遇到大寫或小寫的字符a&#xff0c;就讀取后一個字符并匹配是否為大寫或小寫的字符l&#xff0c;以此類推&#xff0c;匹配任意字…

基于編程的運輸設備管理系統設計(vue+springboot+ssm+mysql8.x)

基于編程的運輸設備管理系統設計&#xff08;vuespringbootssmmysql8.x&#xff09; 運輸設備信息管理系統是一個全面的設備管理平臺&#xff0c;旨在優化設備管理流程&#xff0c;提高運輸效率。系統提供登錄入口&#xff0c;確保只有授權用戶可以訪問。個人中心讓用戶可以查…

6.1 python加載win32或者C#的dll的方法

python很方便的可以加載win32的方法以及C#編寫的dll中的方法或者變量&#xff0c;大致過程如下。 一.python加載win32的方法&#xff0c;使用win32api 1.安裝庫win32api pip install win32api 2.加載所需的win32函數并且調用 import win32api win32api.MessageBox(0,"…

前端精度計算:Decimal.js 基本用法與詳解

一、Decimal.js 簡介 decimal.js 是一個用于任意精度算術運算的 JavaScript 庫&#xff0c;它可以完美解決浮點數計算中的精度丟失問題。 官方API文檔&#xff1a;Decimal.js 特性&#xff1a; 任意精度計算&#xff1a;支持大數、小數的高精度運算。 鏈式調用&#xff1a;…

SQL Server 數據庫實驗報告

??????? 1.1 實驗題目&#xff1a;索引和數據完整性的使用 1.2 實驗目的&#xff1a; &#xff08;1&#xff09;掌握SQL Server的資源管理器界面應用&#xff1b; &#xff08;2&#xff09;掌握索引的使用&#xff1b; &#xff08;3&#xff09;掌握數據完整性的…

AI繪畫中的LoRa是什么?

Lora是一個多義詞&#xff0c;根據不同的上下文可以指代多種事物。以下將詳細介紹幾種主要的含義&#xff1a; LoRa技術 LoRa&#xff08;Long Range Radio&#xff09;是一種低功耗廣域網&#xff08;LPWAN&#xff09;無線通信技術&#xff0c;以其遠距離、低功耗和低成本的特…

哈希表(Hashtable)核心知識點詳解

1. 基本概念 定義&#xff1a;通過鍵&#xff08;Key&#xff09;直接訪問值&#xff08;Value&#xff09;的數據結構&#xff0c;基于哈希函數將鍵映射到存儲位置。 核心操作&#xff1a; put(key, value)&#xff1a;插入鍵值對 get(key)&#xff1a;獲取鍵對應的值 remo…