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

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

期貨量化軟件:赫茲量化系統(tǒng)批次常規(guī)化

2023-10-09 14:26 作者:大牛啊呢  | 我要投稿

在上一篇文章中,我們開始研究旨在提升神經(jīng)網(wǎng)絡(luò)收斂性的方法,并體驗(yàn)了其中一種減少特征協(xié)適應(yīng)的舍棄(Dropout)方法。 我們來繼續(xù)這個(gè)話題,并掌握常規(guī)化方法。

1. 常規(guī)化的理論前提

在神經(jīng)網(wǎng)絡(luò)應(yīng)用實(shí)踐中運(yùn)用了多種數(shù)據(jù)常規(guī)化方法。 然而,它們的作用均是為了令訓(xùn)練樣本數(shù)據(jù)和神經(jīng)網(wǎng)絡(luò)隱藏層的輸出保持在一定范圍內(nèi),并具有某些樣本統(tǒng)計(jì)特征,如方差和中位數(shù)。 這一點(diǎn)很重要,因?yàn)榫W(wǎng)絡(luò)神經(jīng)元在訓(xùn)練過程中利用線性變換將樣本朝逆梯度偏移。

參考一個(gè)含有兩個(gè)隱藏層的全連接感知器。 在前饋驗(yàn)算過程中,每一層都會(huì)生成一個(gè)特定的數(shù)據(jù)集,作為下一層的訓(xùn)練樣本。 輸出層的結(jié)果與參考數(shù)據(jù)進(jìn)行比較。 然后,在反饋驗(yàn)算過程中,誤差梯度自輸出層穿過隱藏層朝向初始數(shù)據(jù)傳播。 每個(gè)神經(jīng)元接收到誤差梯度后,我們更新權(quán)重系數(shù),為最后一次前饋驗(yàn)算的訓(xùn)練樣本調(diào)整神經(jīng)網(wǎng)絡(luò)。 此處會(huì)產(chǎn)生一個(gè)沖突:第二個(gè)隱藏層(下圖中的 H2)會(huì)基于第一個(gè)隱藏層(圖中的 H1)輸出的數(shù)據(jù)樣本進(jìn)行調(diào)整,而通過改變第一個(gè)隱藏層的參數(shù),我們已更改了數(shù)據(jù)數(shù)組。 換言之,我們調(diào)整第二個(gè)隱藏層,其數(shù)據(jù)樣本不再存在。 類似的狀況也發(fā)生在輸出層,因第二個(gè)隱藏層輸出業(yè)已變化,故它也會(huì)被調(diào)整。 如果我們參考第一和第二隱藏層之間的失真,誤差尺度會(huì)更大。 神經(jīng)網(wǎng)絡(luò)越深,影響越強(qiáng)。 這種現(xiàn)象被稱為內(nèi)部協(xié)變量偏移。

實(shí)現(xiàn)

1 為我們的模型創(chuàng)建新的類

我們已經(jīng)研究過理論方面,現(xiàn)在我們在函數(shù)庫中實(shí)現(xiàn)它。 我們創(chuàng)建一個(gè)新類 CNeuronBatchNormOCL 來實(shí)現(xiàn)該算法。

class CNeuronBatchNormOCL ?: ?public CNeuronBaseOCL ?{ protected: ? CNeuronBaseOCL ? ?*PrevLayer; ? ? ? ///< Pointer to the object of the previous layer ? uint ? ? ? ? ? ? ?iBatchSize; ? ? ? ///< Batch size ? CBufferDouble ? ? *BatchOptions; ? ?///< Container of method parameters ? ? ///\ingroup neuron_base_ff ? virtual bool ? ? ?feedForward(CNeuronBaseOCL *NeuronOCL); ? ? ? ? ? ? ? ///< \brief Feed Forward method of calling kernel ::BatchFeedForward().@param NeuronOCL Pointer to previous layer. ? ///\ingroup neuron_base_opt ? virtual bool ? ? ?updateInputWeights(CNeuronBaseOCL *NeuronOCL); ? ? ? ?///< Method for updating weights.\details Calling one of kernels ::UpdateBatchOptionsMomentum() or ::UpdateBatchOptionsAdam() in depends on optimization type (#ENUM_OPTIMIZATION).@param NeuronOCL Pointer to previous layer. public: ? /** Constructor */CNeuronBatchNormOCL(void); ? /** Destructor */~CNeuronBatchNormOCL(void); //--- ? virtual bool ? ? ?Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint numNeurons, uint batchSize, 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] numNeurons Number of neurons in layer @param optimization_type Optimization type (#ENUM_OPTIMIZATION)@return Boolen result of operations. //--- ? virtual int ? ? ? getOutputIndex(void) ? ? ? ? ?{ ?return (iBatchSize>1 ? Output.GetIndex() : PrevLayer.getOutputIndex()); ? ? ? ? ? ? } ?///< Get index of output buffer @return Index ? virtual int ? ? ? getGradientIndex(void) ? ? ? ?{ ?return (iBatchSize>1 ? Gradient.GetIndex() : PrevLayer.getGradientIndex()); ? ? ? ? ?} ?///< Get index of gradient buffer @return Index ? //--- ? virtual int ? ? ? getOutputVal(double &values[]) ? { ?return (iBatchSize>1 ? Output.GetData(values) : PrevLayer.getOutputVal(values)); } ?///< Get values of output buffer @param[out] values Array of data @return number of items ? virtual int ? ? ? getOutputVal(CArrayDouble *values) ? { ?return (iBatchSize>1 ? Output.GetData(values) : PrevLayer.getOutputVal(values)); } ?///< Get values of output buffer @param[out] values Array of data @return number of items ? virtual int ? ? ? getGradient(double &values[]) ? ?{ ?return (iBatchSize>1 ? Gradient.GetData(values) : PrevLayer.getGradient(values)); ? ?} ?///< Get values of gradient buffer @param[out] values Array of data @return number of items ? virtual CBufferDouble ? *getOutput(void) ? ? ? ? ? { ?return (iBatchSize>1 ? Output : PrevLayer.getOutput()); ? ? ?} ? ? ? ? ? ? ? ? ///< Get pointer of output buffer @return Pointer to object ? virtual CBufferDouble ? *getGradient(void) ? ? ? ? { ?return (iBatchSize>1 ? Gradient : PrevLayer.getGradient()); ?} ? ? ? ? ? ? ? ? ///< Get pointer of gradient buffer @return Pointer to object //--- ? virtual bool ? ? ?calcInputGradients(CNeuronBaseOCL *NeuronOCL); ? ? ? ? ?///< Method to transfer gradient to previous layer by calling kernel ::CalcHiddenGradientBatch(). @param NeuronOCL Pointer to next layer. ? //--- ? 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 ? //--- ? virtual int ? ? ? Type(void) ? ? ? ?const ? ? ? ? ? ? ? ? ? ? ?{ ?return defNeuronBatchNormOCL; ? ?}///< Identificator of class.@return Type of class ?};

新類將自 CNeuronBaseOCL 基類繼承。 如同 CNeuronDropoutOCL 類一樣外推,我們添加 PrevLayer 變量。 當(dāng)指定的批次尺寸小于 “2” 時(shí),將應(yīng)用上一篇文章中展示的數(shù)據(jù)緩沖區(qū)替換方法,將其保存到 iBatchSize 變量之中。

批次常規(guī)化算法需要保存一些參數(shù),這些參數(shù)對于已常規(guī)化層的每個(gè)神經(jīng)元都是獨(dú)立的。 出于避免為每個(gè)單獨(dú)的參數(shù)生成過多的單獨(dú)緩沖區(qū),我們將為這些參數(shù)創(chuàng)建含有以下結(jié)構(gòu)的單一 BatchOptions 緩沖區(qū)。



從呈現(xiàn)的結(jié)構(gòu)可以看出,參數(shù)緩沖區(qū)的大小將取決于所采用的參數(shù)優(yōu)化方法,因此其會(huì)在類初始化方法中創(chuàng)建。

類方法的集合都已經(jīng)標(biāo)準(zhǔn)化。 我們來查看它們。 在類構(gòu)造函數(shù)中,我們重置指向?qū)ο蟮闹羔?,并將批次尺寸設(shè)置為 1,其實(shí)質(zhì)是把層從網(wǎng)絡(luò)操作中排除,直至它被初始化。


期貨量化軟件:赫茲量化系統(tǒng)批次常規(guī)化的評論 (共 條)

分享到微博請遵守國家法律
定襄县| 建湖县| 平果县| 灌阳县| 水富县| 时尚| 夏邑县| 乌审旗| 普定县| 九龙坡区| 澄城县| 玉山县| 浪卡子县| 建始县| 滨州市| 洪泽县| 桂东县| 定结县| 台州市| 翁牛特旗| 徐州市| 怀远县| 祥云县| 涡阳县| 尼勒克县| 太和县| 外汇| 兴海县| 博兴县| 桂林市| 剑河县| 寻甸| 六安市| 繁峙县| 双城市| 南陵县| 静海县| 乌苏市| 丹寨县| 乐安县| 新乡县|