最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

量化交易軟件:神經(jīng)網(wǎng)絡(luò)變得輕松11

2023-08-04 16:14 作者:bili_45793681098  | 我要投稿

概述

在 2018 年 6 月,OpenAI 提出了 GPT 神經(jīng)網(wǎng)絡(luò)模型,該模型立即在多種語(yǔ)言類測(cè)試中展現(xiàn)出極佳結(jié)果。 GDP-2 于 2019 年出現(xiàn),而 GPT-3 則于 2020 年 5 月提出。 這些模型展示了神經(jīng)網(wǎng)絡(luò)生成相關(guān)文本的能力。 尚有其他實(shí)驗(yàn)涉及生成音樂和圖像的能力。 這一模型的主要缺點(diǎn)與它們涉及的計(jì)算資源相關(guān)。 在配備 8 顆 GPU 的計(jì)算機(jī)上訓(xùn)練第一個(gè) GPT 花費(fèi)了一個(gè)月的時(shí)間。 為了解決新問題,使用預(yù)先訓(xùn)練的模型,可部分彌補(bǔ)這一缺陷。 但考慮到模型的規(guī)模,需要大量資源來維持模型的運(yùn)行。

編輯切換為居中


1. 理解 GPT 模型

從概念來講,GPT 模型是在之前研究的變換器基礎(chǔ)上構(gòu)建的。 主要思路是基于大數(shù)據(jù)針對(duì)模型進(jìn)行無監(jiān)督預(yù)訓(xùn)練,然后再依據(jù)相對(duì)少量的標(biāo)記數(shù)據(jù)進(jìn)行微調(diào)。

分兩步訓(xùn)練的原因在于模型規(guī)模。 像 GPT 這樣的現(xiàn)代深度機(jī)器學(xué)習(xí)模型涉及大量參數(shù),可多達(dá)數(shù)億個(gè)。 因此,這種神經(jīng)網(wǎng)絡(luò)的訓(xùn)練需要大量的訓(xùn)練樣本。 當(dāng)采用監(jiān)督學(xué)習(xí)時(shí),創(chuàng)建帶標(biāo)記的訓(xùn)練樣本集合是件勞動(dòng)密集型工作。 與此同時(shí),網(wǎng)站上有許多不同的數(shù)字化和無標(biāo)記文本,這些文本非常適合模型的無監(jiān)督訓(xùn)練。 然而,統(tǒng)計(jì)數(shù)據(jù)表明,無監(jiān)督學(xué)習(xí)相較監(jiān)督學(xué)習(xí),其結(jié)果要差很多。 因此,在無監(jiān)督訓(xùn)練之后,可依據(jù)相對(duì)少量的標(biāo)記數(shù)據(jù)樣本針對(duì)模型進(jìn)行微調(diào)。

無監(jiān)督學(xué)習(xí)可令 GPT 學(xué)習(xí)語(yǔ)言類模型,而針對(duì)特定任務(wù),可依據(jù)標(biāo)記數(shù)據(jù)進(jìn)一步訓(xùn)練,從而調(diào)整模型。 因此,為了執(zhí)行不同的語(yǔ)言類任務(wù),可以復(fù)制并微調(diào)一個(gè)預(yù)訓(xùn)練的模型。 該限制基于采用無監(jiān)督學(xué)習(xí)的原始語(yǔ)言集合。

實(shí)踐表明,這種方法對(duì)于廣泛的語(yǔ)言問題能產(chǎn)生良好的效果。 例如,GPT-3 模型能夠針對(duì)給定主題生成連貫流暢的文本。 不過,請(qǐng)注意,指定的模型包含 1750 億個(gè)參數(shù),按順序依據(jù) 570GB 的數(shù)據(jù)集合上進(jìn)行了預(yù)訓(xùn)練。

盡管 GPT 模型是為處理自然語(yǔ)言類而開發(fā)的,但它們?cè)谝魳泛蛨D像生成任務(wù)中也表現(xiàn)出色。

理論上,GPT 模型可與任何數(shù)字化數(shù)據(jù)序列配合使用。 唯一的前置需求是無監(jiān)督的預(yù)學(xué)習(xí)需要足夠的數(shù)據(jù)和資源。

2. GPT 與之前研究的變換器之間的區(qū)別

赫茲量化來研究 GPT 模型與之前研究的變換器有何區(qū)別。 首先,GPT 模型未使用編碼器,因?yàn)樗鼈儍H使用解碼器。 當(dāng)沒有編碼器時(shí),模型不再擁有“編碼器 - 解碼器自關(guān)注”內(nèi)層。 下圖展示了 GPT 變換器模塊。


編輯

與經(jīng)典的變換器相似,GPT 模型中的模塊在彼此之上構(gòu)建。 每個(gè)模塊針對(duì)關(guān)注機(jī)制都有自己的權(quán)重矩陣,并具有完全連接的前饋層。 模塊的數(shù)量決定了模型的規(guī)模。 模塊堆棧可能會(huì)很龐大。 GPT-1 和最小的 GPT-2(小型 GPT-2)有 12 個(gè)模塊;GPT-2 特大型有 48 個(gè),而 GPT-3 則有 96 個(gè)模塊。

與傳統(tǒng)語(yǔ)言類模型類似,GPT 僅能夠發(fā)現(xiàn)與序列中先前元素的關(guān)系,但無法窺視未來。 但它與變換器不同,GPT 不使用元素的掩碼 — 代之,它更改了計(jì)算過程。 GPT 會(huì)重置 Score 矩陣中后續(xù)元素的關(guān)注比率。

同時(shí),GPT 可被歸類為自回歸模型。 每次迭代都會(huì)生成一個(gè)序列令牌。 生成的令牌會(huì)被添加到輸入序列中,并饋入模型進(jìn)行下一次迭代。

與經(jīng)典變換器一樣,自關(guān)注機(jī)制內(nèi)的每個(gè)令牌都會(huì)生成三個(gè)向量:一個(gè) query,一個(gè) key,和一個(gè) value。 在自回歸模型當(dāng)中,在每次新迭代里,輸入序列僅能由 1 個(gè)令牌更改,因此每個(gè)令牌無需重新計(jì)算向量。 因此,GPT 中的每一層只在序列有新元素時(shí)計(jì)算向量。 每個(gè)變換器模塊都保存其向量,以備后用。

這種方式令模型能夠在接收最終令牌之前逐詞生成文本。

當(dāng)然,GPT 模型采用多目擊者關(guān)注機(jī)制。


3. 實(shí)現(xiàn)

在開始之前,我們來簡(jiǎn)要地復(fù)習(xí)一下算法:


  1. 令牌的輸入序列會(huì)被饋入到變換器模塊之中。

針對(duì)所有自關(guān)注目擊者的一個(gè)序列。 進(jìn)而,對(duì)于每個(gè)關(guān)注的目擊者,2-5 中的動(dòng)作是相同的。

  1. 令牌向量乘以相應(yīng)的權(quán)重矩陣 W(已訓(xùn)練),可計(jì)算每個(gè)令牌的三個(gè)向量(query,key,value)。

  2. 將 'query' 和 'key' 相乘,赫茲量化可判定序列元素之間的依賴性。 在此步驟,將序列中每個(gè)元素的向量 'query' 乘以序列中當(dāng)前元素和所有先前元素的 'key' 向量。

  3. 在每個(gè) query 的上下文中,使用 SoftMax 函數(shù)對(duì)獲得的關(guān)注得分矩陣進(jìn)行常規(guī)化。 序列的后續(xù)元素則設(shè)置了零關(guān)注分?jǐn)?shù)。

作為第 3 步和第 4 步的結(jié)果,赫茲量化獲得了平方矩陣 Score,該平方矩陣的大小依據(jù)序列中元素的數(shù)量來確定,在其內(nèi)每個(gè) 'query' 的上下文中所有元素的合計(jì)為 “1”。

  1. 將常規(guī)化的關(guān)注分?jǐn)?shù)乘以序列相應(yīng)元素的 'value' 向量,然后與結(jié)果向量相加,我們可以得到序列 (Z) 的每個(gè)元素的關(guān)注校正值。

  2. 接下來,赫茲量化基于所有關(guān)注目擊者的結(jié)果斷定加權(quán) Z 向量。 為此,將來自所有關(guān)注目擊者的校正后的 “value” 向量串聯(lián)到單一向量,然后乘以正在訓(xùn)練的 W0 矩陣。

  3. 所得張量會(huì)被添加到輸入序列,并進(jìn)行常規(guī)化。

  4. 多目擊者自關(guān)注機(jī)制后隨前饋模塊的兩個(gè)完全連接層。 第一層(隱藏)包含的神經(jīng)元數(shù)量比之含有 ReLU 激活函數(shù)的輸入序列多 4 倍。 第二層的尺寸等于輸入序列的尺寸,且神經(jīng)元不使用激活函數(shù)。

  5. 完全連接層的結(jié)果與張量求和,其張量將被饋入前饋模塊。 然后將生成的張量常規(guī)化。


3.1. 為我們的模型創(chuàng)建新類。

為了實(shí)現(xiàn)我們的模型,我們?cè)?CNeuronBaseOCL 基類的基礎(chǔ)上創(chuàng)建一個(gè)新類 CNeuronMLMHAttentionOCL。 我故意退后一步,且沒有使用之前創(chuàng)建的關(guān)注類。 這是因?yàn)槟壳拔覀儾捎昧诵碌摹岸嗄繐粽咦躁P(guān)注”創(chuàng)建原理。 早前,在文章第十部分中,赫茲量化創(chuàng)建了 CNeuronMHAttentionOCL 類,該類可順序提供 4 個(gè)關(guān)注線程的重新計(jì)算。 線程數(shù)量在方法里是硬編碼的,因此更改線程數(shù)量會(huì)需要大量工時(shí),這會(huì)涉及修改類及其方法的相關(guān)代碼。

警告。 如上所述,GPT 模型采用含有相同(不可更改)超參數(shù)的相同變換器模塊的堆棧,唯一的區(qū)別在于其所正在訓(xùn)練的矩陣。 因此,我決定創(chuàng)建一個(gè)多層模塊,它允許創(chuàng)建帶有超參數(shù)的模型,在創(chuàng)建類時(shí)這些模型可作為傳遞參數(shù)。 這包括堆棧中變換器模塊的重復(fù)次數(shù)。

結(jié)果就是,赫茲量化有了一個(gè)類,它可基于一些指定的參數(shù)來創(chuàng)建幾乎整個(gè)模型。 因此,在新類的“保護(hù)”部分中,我們聲明五個(gè)變量來存儲(chǔ)模塊參數(shù):

iLayers

模型中的變換器模塊數(shù)量

iHeads

自關(guān)注目擊者的數(shù)量

iWindow

輸入窗口大?。? 個(gè)輸入序列令牌)

iWindowKey

內(nèi)部向量 Query、Key、Value 的維度

iUnits

輸入序列中的元素(令牌)數(shù)量

還有,在受保護(hù)部分中,聲明 6 個(gè)數(shù)組,來存儲(chǔ)緩沖區(qū)集合,其內(nèi)是我們的張量和訓(xùn)練權(quán)重矩陣:

QKV_Tensors

存儲(chǔ)張量 Query、Key、Value,及其梯度的數(shù)組

QKV_Weights

存儲(chǔ) Wq、Wk、Wv 權(quán)重矩陣、及其動(dòng)量矩陣集合的數(shù)組

S_Tensors

存儲(chǔ) Score 矩陣、及其梯度集合的數(shù)組

AO_Tensors

存儲(chǔ)自關(guān)注機(jī)制輸出張量、及其梯度的數(shù)組

FF_Tensors

存儲(chǔ)前饋模塊輸入、隱藏和輸出張量、及其梯度的數(shù)組

FF_Weights

存儲(chǔ)前饋模塊權(quán)重矩陣、及其動(dòng)量的數(shù)組。

赫茲量化將在以后實(shí)現(xiàn)它們時(shí),再研究該類方法。

class CNeuronMLMHAttentionOCL ? ? ? : ?public CNeuronBaseOCL ?{ protected: ? uint ? ? ? ? ? ? ?iLayers; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ///< Number of inner layers ? uint ? ? ? ? ? ? ?iHeads; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< Number of heads ? uint ? ? ? ? ? ? ?iWindow; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ///< Input window size ? uint ? ? ? ? ? ? ?iUnits; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< Number of units ? uint ? ? ? ? ? ? ?iWindowKey; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< Size of Key/Query window //--- ? CCollection ? ? ? *QKV_Tensors; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< The collection of tensors of Queries, Keys and Values ? CCollection ? ? ? *QKV_Weights; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< The collection of Matrix of weights to previous layer ? CCollection ? ? ? *S_Tensors; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?///< The collection of Scores tensors ? CCollection ? ? ? *AO_Tensors; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ///< The collection of Attention Out tensors ? CCollection ? ? ? *FF_Tensors; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ///< The collection of tensors of Feed Forward output ? CCollection ? ? ? *FF_Weights; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ///< The collection of Matrix of Feed Forward weights ///\ingroup neuron_base_ff ? virtual bool ? ? ?feedForward(CNeuronBaseOCL *NeuronOCL); ? ? ? ? ? ? ? ///< \brief Feed Forward method of calling kernel ::FeedForward().@param NeuronOCL Pointer to previos layer. ? virtual bool ? ? ?ConvolutionForward(CBufferDouble *weights, CBufferDouble *inputs,CBufferDouble *outputs, uint window, uint window_out, ENUM_ACTIVATION activ); ? ///< \brief Convolution Feed Forward method of calling kernel ::FeedForwardConv(). ? virtual bool ? ? ?AttentionScore(CBufferDouble *qkv, CBufferDouble *scores, bool mask=true); ? ///< \brief Multi-heads attention scores method of calling kernel ::MHAttentionScore(). ? virtual bool ? ? ?AttentionOut(CBufferDouble *qkv, CBufferDouble *scores, CBufferDouble *out); ? ///< \brief Multi-heads attention out method of calling kernel ::MHAttentionOut(). ? virtual bool ? ? ?SumAndNormilize(CBufferDouble *tensor1, CBufferDouble *tensor2, CBufferDouble *out); ? ///< \brief Method sum and normalize 2 tensors by calling 2 kernels ::SumMatrix() and ::Normalize(). ///\ingroup neuron_base_opt ? virtual bool ? ? ?updateInputWeights(CNeuronBaseOCL *NeuronOCL); ? ? ? ?///< Method for updating weights.\details Calling one of kernels ::UpdateWeightsMomentum() or ::UpdateWeightsAdam() in depends on optimization type (#ENUM_OPTIMIZATION).@param NeuronOCL Pointer to previos layer. ? virtual bool ? ? ?ConvolutuionUpdateWeights(CBufferDouble *weights, CBufferDouble *gradient, CBufferDouble *inputs, CBufferDouble *momentum1, CBufferDouble *momentum2, uint window, uint window_out); ? ///< Method for updating weights in convolution layer.\details Calling one of kernels ::UpdateWeightsConvMomentum() or ::UpdateWeightsConvAdam() in depends on optimization type (#ENUM_OPTIMIZATION). ? virtual bool ? ? ?ConvolutionInputGradients(CBufferDouble *weights, CBufferDouble *gradient, CBufferDouble *inputs, CBufferDouble *inp_gradient, uint window, uint window_out, uint activ); ? ///< Method of passing gradients through a convolutional layer. ? virtual bool ? ? ?AttentionInsideGradients(CBufferDouble *qkv,CBufferDouble *qkv_g,CBufferDouble *scores,CBufferDouble *scores_g,CBufferDouble *gradient); ? ///< Method of passing gradients through attention layer. public: ? /** Constructor */CNeuronMLMHAttentionOCL(void); ? /** Destructor */~CNeuronMLMHAttentionOCL(void); ? virtual bool ? ? ?Init(uint numOutputs,uint myIndex,COpenCLMy *open_cl, uint window, uint window_key, uint heads, uint units_count, uint layers, ENUM_OPTIMIZATION optimization_type); ? ///< Method of initialization class.@param[in] numOutputs Number of connections to next layer.@param[in] myIndex Index of neuron in layer.@param[in] open_cl Pointer to #COpenCLMy object.@param[in] window Size of in/out window and step.@param[in] units_countNumber of neurons.@param[in] optimization_type Optimization type (#ENUM_OPTIMIZATION)@return Boolen result of operations. ? virtual bool ? ? ?calcInputGradients(CNeuronBaseOCL *prevLayer); ?///< Method to transfer gradients to previous layer @param[in] prevLayer Pointer to previous layer. ? //--- ? virtual int ? ? ? Type(void) ? const ? { ?return defNeuronMLMHAttentionOCL; ? }///< Identificator of class.@return Type of class ? //--- methods for working with files ? virtual bool ? ? ?Save(int const file_handle); ?///< Save method @param[in] file_handle handle of file @return logical result of operation ? virtual bool ? ? ?Load(int const file_handle); ?///< Load method @param[in] file_handle handle of file @return logical result of operation ?};

在類的構(gòu)造函數(shù)當(dāng)中,赫茲量化為類的超參數(shù)設(shè)置初始值,并初始化集合數(shù)組。

CNeuronMLMHAttentionOCL::CNeuronMLMHAttentionOCL(void) ? : ?iLayers(0), ? iHeads(0), ? iWindow(0), ? iWindowKey(0), ? iUnits(0) ?{ ? QKV_Tensors=new CCollection(); ? QKV_Weights=new CCollection(); ? S_Tensors=new CCollection(); ? AO_Tensors=new CCollection(); ? FF_Tensors=new CCollection(); ? FF_Weights=new CCollection(); ?}

相應(yīng)地,我們類的析構(gòu)函數(shù)中的集合數(shù)組刪除了。

CNeuronMLMHAttentionOCL::~CNeuronMLMHAttentionOCL(void) ?{ ? if(CheckPointer(QKV_Tensors)!=POINTER_INVALID) ? ? ?delete QKV_Tensors; ? if(CheckPointer(QKV_Weights)!=POINTER_INVALID) ? ? ?delete QKV_Weights; ? if(CheckPointer(S_Tensors)!=POINTER_INVALID) ? ? ?delete S_Tensors; ? if(CheckPointer(AO_Tensors)!=POINTER_INVALID) ? ? ?delete AO_Tensors; ? if(CheckPointer(FF_Tensors)!=POINTER_INVALID) ? ? ?delete FF_Tensors; ? if(CheckPointer(FF_Weights)!=POINTER_INVALID) ? ? ?delete FF_Weights; ?}

類的初始化,以及模型的構(gòu)建是在 Init 方法當(dāng)中執(zhí)行。 該方法會(huì)從參數(shù)里接收:

numOutputs

后續(xù)一層中所需創(chuàng)建鏈接的元素?cái)?shù)量

myIndex

層中的神經(jīng)元索引

open_cl

OpenCL 對(duì)象指針

window

輸入窗口大?。ㄝ斎胄蛄辛钆疲?/p>

window_key

內(nèi)部向量 Query、Key、Value 的維度

heads

自關(guān)注目擊者(線程)數(shù)量

units_count

輸入序列中的元素?cái)?shù)量

layers

在模型堆棧中的模塊(層)數(shù)量

optimization_type

在訓(xùn)練期間的參數(shù)優(yōu)化方法

bool CNeuronMLMHAttentionOCL::Init(uint numOutputs,uint myIndex,COpenCLMy *open_cl,uint window,uint window_key,uint heads,uint units_count,uint layers,ENUM_OPTIMIZATION optimization_type) ?{ ? if(!CNeuronBaseOCL::Init(numOutputs,myIndex,open_cl,window*units_count,optimization_type)) ? ? ?return false; //--- ? iWindow=fmax(window,1); ? iWindowKey=fmax(window_key,1); ? iUnits=fmax(units_count,1); ? iHeads=fmax(heads,1); ? iLayers=fmax(layers,1);

在方法伊始,赫茲量化調(diào)用相應(yīng)的方法來初始化父類。 請(qǐng)注意,我們沒有執(zhí)行基礎(chǔ)的檢查來驗(yàn)證所收到的 OpenCL 對(duì)象指針,和輸入序列的大小,因?yàn)檫@些檢查已在父類方法中實(shí)現(xiàn)。

成功初始化父類之后,我們將超參數(shù)保存到相應(yīng)的變量當(dāng)中。

接著,我們計(jì)算所要?jiǎng)?chuàng)建的張量大小。 請(qǐng)注意,以前的組織多目擊者關(guān)注的修改方式。 我們不會(huì)為 'query'、'key' 和 'value' 向量創(chuàng)建單獨(dú)的數(shù)組 - 它們將合并到一個(gè)數(shù)組。 進(jìn)而,我們不會(huì)為每個(gè)關(guān)目擊者創(chuàng)建單獨(dú)的數(shù)組。 代之,我們將為 QKV(query + key + value)、Scores和自關(guān)注機(jī)制的輸出創(chuàng)建通用數(shù)組。 這些元素將在張量中的索引級(jí)別切分為序列。 當(dāng)然,這種方式更難以理解。 在張量中查找所需元素也許會(huì)更加困難。 但是,它能令模型變得更靈活,根據(jù)關(guān)注目擊者的數(shù)量,并依據(jù)內(nèi)核級(jí)別的并行線程來組織規(guī)劃所有關(guān)注目擊者的并發(fā)重新計(jì)算。

QKV_Tensor(數(shù)字)張量的大小定義為內(nèi)部向量(query + key + value)的三個(gè)大小與目擊者數(shù)量的乘積。 級(jí)聯(lián)權(quán)重矩陣 QKV_Weight 的大小定義為輸入序列令牌的三個(gè)大小的乘積,并依據(jù)偏移元素、內(nèi)部向量的大小和關(guān)注目擊者數(shù)量遞增。 與此類似,我們計(jì)算剩余張量的大小。


量化交易軟件:神經(jīng)網(wǎng)絡(luò)變得輕松11的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
沅江市| 吴旗县| 安远县| 四子王旗| 曲阜市| 印江| 孝感市| 青川县| 长武县| 始兴县| 武鸣县| 儋州市| 比如县| 麟游县| 什邡市| 清流县| 宝坻区| 景泰县| 江油市| 通辽市| 昭苏县| 思茅市| 达日县| 普安县| 阳城县| 潼关县| 滦平县| 三穗县| 太和县| 龙里县| 屏东县| 亚东县| 临猗县| 七台河市| 故城县| 奉节县| 临沂市| 宜州市| 永泰县| 社会| 海口市|