本發(fā)明涉及adagrad算法應(yīng)用技術(shù)領(lǐng)域,更具體地涉及一種用于執(zhí)行adagrad梯度下降訓(xùn)練算法的裝置和方法。
背景技術(shù):
梯度下降優(yōu)化算法在函數(shù)逼近、優(yōu)化計(jì)算、模式識(shí)別和圖像處理等領(lǐng)域被廣泛應(yīng)用,adagrad算法由于其易于實(shí)現(xiàn),計(jì)算量小,所需存儲(chǔ)空間小以及能夠自適應(yīng)地為各個(gè)參數(shù)分配學(xué)習(xí)率等特征被廣泛的使用。采用專用裝置實(shí)現(xiàn)adagrad算法可以顯著提高其執(zhí)行的速度。
目前,一種執(zhí)行adagrad梯度下降算法的已知方法是使用通用處理器。該方法通過(guò)使用通用寄存器堆和通用功能部件執(zhí)行通用指令來(lái)支持上述算法。該方法的缺點(diǎn)之一是單個(gè)通用處理器的運(yùn)算性能較低。而多個(gè)通用處理器并行執(zhí)行時(shí),通用處理器之間相互通信又成為了性能瓶頸。另外,通用處理器需要把a(bǔ)dagrad梯度下降算法對(duì)應(yīng)的相關(guān)運(yùn)算譯碼成一長(zhǎng)列運(yùn)算及訪存指令序列,處理器前端譯碼帶來(lái)了較大的功耗開(kāi)銷(xiāo)。
另一種執(zhí)行adagrad梯度下降算法的已知方法是使用圖形處理器(gpu)。該方法通過(guò)使用通用寄存器堆和通用流處理單元執(zhí)行通用simd指令來(lái)支持上述算法。由于gpu是專門(mén)用來(lái)執(zhí)行圖形圖像運(yùn)算以及科學(xué)計(jì)算的設(shè)備,沒(méi)有對(duì)adagrad梯度下降算法相關(guān)運(yùn)算的專門(mén)支持,仍然需要大量的前端譯碼工作才能執(zhí)行adagrad梯度下降算法中的相關(guān)運(yùn)算,由此帶來(lái)了大量的額外開(kāi)銷(xiāo)。另外,gpu只有較小的片上緩存,運(yùn)算中所需數(shù)據(jù)(如歷史梯度值)需要反復(fù)從片外搬運(yùn),片外帶寬成為了主要性能瓶頸,同時(shí)帶來(lái)了巨大的功耗開(kāi)銷(xiāo)。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供一種用于執(zhí)行adagrad梯度下降算法的裝置和方法,以解決至少一個(gè)上述技術(shù)問(wèn)題。
為了實(shí)現(xiàn)上述目的,作為本發(fā)明的一個(gè)方面,本發(fā)明提供了一種用于執(zhí)行adagrad梯度下降算法的裝置,包括:
控制器單元,用于將讀取的指令譯碼為控制相應(yīng)模塊的微指令,并將其發(fā)送給相應(yīng)模塊;
數(shù)據(jù)緩存單元,用于存儲(chǔ)運(yùn)算過(guò)程中的中間變量,并對(duì)所述中間變量執(zhí)行初始化及更新操作;
數(shù)據(jù)處理模塊,用于在所述控制器單元的控制下執(zhí)行運(yùn)算操作,包括向量加法運(yùn)算、向量乘法運(yùn)算、向量除法運(yùn)算、向量平方根運(yùn)算及基本運(yùn)算,并將中間變量存儲(chǔ)于所述數(shù)據(jù)緩存單元中。
其中,所述數(shù)據(jù)處理模塊包括運(yùn)算控制子模塊、并行向量加法運(yùn)算單元、并行向量乘法運(yùn)算單元、并行向量乘法運(yùn)算單元、并行向量平方根運(yùn)算單元以及基本運(yùn)算子模塊。
其中,所述數(shù)據(jù)處理模塊針對(duì)同一向量執(zhí)行運(yùn)算時(shí),不同位置元素能夠并行執(zhí)行運(yùn)算。
其中,所述數(shù)據(jù)緩存單元在裝置初始化時(shí),初始化歷史梯度值的平方和
其中,所述數(shù)據(jù)緩存單元在每次數(shù)據(jù)更新過(guò)程中,將歷史梯度值的平方和
所述數(shù)據(jù)處理模塊從所述數(shù)據(jù)緩存單元中讀取歷史梯度值的平方和
作為本發(fā)明的另一個(gè)方面,本發(fā)明還提供了一種執(zhí)行adagrad梯度下降算法的方法,其特征在于,包括以下步驟:
步驟(1),對(duì)數(shù)據(jù)緩存單元進(jìn)行初始化,包括對(duì)常數(shù)α,ε設(shè)置初值以及對(duì)歷史梯度平方和
步驟(2),從外部空間讀取待更新參數(shù)向量和對(duì)應(yīng)的梯度向量;
步驟(3),數(shù)據(jù)處理模塊讀取并計(jì)算更新數(shù)據(jù)緩存單元中的歷史梯度平方和
步驟(4),數(shù)據(jù)處理模塊利用自適應(yīng)學(xué)習(xí)率及當(dāng)前梯度值完成對(duì)待更新向量的更新操作,更新操作計(jì)算公式如下:
其中,wt表示當(dāng)前,即第t次的待更新參數(shù),δl(wt)表示當(dāng)前待更新參數(shù)的梯度值,wt+1表示更新后的參數(shù),也是下一次,即t+1次迭代運(yùn)算的待更新參數(shù);
步驟(5),數(shù)據(jù)處理單元判斷更新后的參數(shù)向量是否收斂,若收斂,運(yùn)算結(jié)束,否則,轉(zhuǎn)到步驟(2)處繼續(xù)執(zhí)行。
以及一種執(zhí)行adagrad梯度下降算法的裝置,所述裝置的控制器中固化有執(zhí)行如上所述方法的程序。
作為本發(fā)明的再一個(gè)方面,本發(fā)明還提供了一種執(zhí)行adagrad梯度下降算法的方法,其特征在于,包括以下步驟:
步驟s1,在指令緩存單元的首地址處預(yù)先存入一條io指令;
步驟s2,控制器單元從指令緩存單元的首地址讀取該條io指令,根據(jù)譯出的微指令,數(shù)據(jù)訪問(wèn)單元從外部地址空間讀取所有與adagrad梯度下降計(jì)算有關(guān)的所有指令,并將其緩存入指令緩存單元中;
步驟s3,控制器單元從指令緩存單元讀入賦值指令,根據(jù)譯出的微指令,數(shù)據(jù)緩存單元中的歷史梯度平方和
步驟s4,控制器單元從指令緩存單元讀入一條io指令,根據(jù)譯出的微指令,數(shù)據(jù)訪問(wèn)單元從外部空間讀取待更新參數(shù)向量wt和對(duì)應(yīng)的梯度向量δl(wt)讀入到數(shù)據(jù)緩存單元中;
步驟s5,控制器單元從指令緩存單元讀入一條數(shù)據(jù)傳輸指令,根據(jù)譯出的微指令,數(shù)據(jù)緩存單元中的歷史梯度平方和
步驟s6,控制器單元從指令緩存單元讀入一條向量指令,根據(jù)譯出的微指令,進(jìn)行歷史梯度平方和
步驟s7,控制器單元從指令緩存單元讀取一條指令,根據(jù)譯出的微指令,更新后的歷史梯度平方和
步驟s8,控制器單元從指令緩存單元讀取一條自適應(yīng)學(xué)習(xí)率運(yùn)算指令,根據(jù)譯出的微指令,運(yùn)算控制子模塊控制相關(guān)運(yùn)算模塊進(jìn)行如下操作:利用向量平方根并行運(yùn)算子模塊計(jì)算
步驟s9,控制器單元從指令緩存單元讀取一條參數(shù)向量更新指令,根據(jù)譯出的微指令,驅(qū)動(dòng)運(yùn)算控制子模塊進(jìn)行如下的運(yùn)算:利用向量乘法并行運(yùn)算單元子模塊計(jì)算出
步驟s10,控制器單元從指令緩存單元讀取一條io指令,根據(jù)譯出的微指令,更新后的參數(shù)向量wt+1從數(shù)據(jù)處理單元通過(guò)數(shù)據(jù)訪問(wèn)單元傳送至外部地址空間指定地址;
步驟s11,控制器單元從指令緩存單元讀取一條收斂判斷指令,根據(jù)譯出的微指令,數(shù)據(jù)處理單元判斷更新后的參數(shù)向量是否收斂,若收斂,運(yùn)算結(jié)束,否則,轉(zhuǎn)到步驟s5處繼續(xù)執(zhí)行。
以及一種執(zhí)行adagrad梯度下降算法的裝置,所述裝置的控制器中固化有執(zhí)行如上所述方法的程序。
基于上述技術(shù)方案可知,本發(fā)明的裝置和方法具有如下有益效果:使用該裝置可以實(shí)現(xiàn)adagrad梯度下降算法,并大幅度提高數(shù)據(jù)處理的效率;通過(guò)采用專門(mén)用于執(zhí)行adagrad梯度下降算法的設(shè)備,可以解決數(shù)據(jù)的通用處理器運(yùn)算性能不足,前段譯碼開(kāi)銷(xiāo)大的問(wèn)題,加速相關(guān)應(yīng)用的執(zhí)行速度,大幅度提高數(shù)據(jù)處理的效率;同時(shí),對(duì)數(shù)據(jù)緩存單元的應(yīng)用,避免了反復(fù)向內(nèi)存讀取數(shù)據(jù),降低了內(nèi)存訪問(wèn)的帶寬。
附圖說(shuō)明
圖1為根據(jù)本發(fā)明一實(shí)施例的用于實(shí)現(xiàn)adagrad梯度下降算法相關(guān)應(yīng)用的裝置的整體結(jié)構(gòu)的示例框圖;
圖2為根據(jù)本發(fā)明一實(shí)施例的用于實(shí)現(xiàn)adagrad梯度下降算法相關(guān)應(yīng)用的裝置中數(shù)據(jù)處理模塊的示例框圖;
圖3為根據(jù)本發(fā)明一實(shí)施例的用于實(shí)現(xiàn)adagrad梯度下降算法相關(guān)應(yīng)用的運(yùn)算的流程圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,以下結(jié)合具體實(shí)施例,并參照附圖,對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。通過(guò)以下詳細(xì)描述,本發(fā)明的其它方面、優(yōu)勢(shì)和突出特征對(duì)于本領(lǐng)域技術(shù)人員將變得顯而易見(jiàn)。
在本說(shuō)明書(shū)中,下述用于描述本發(fā)明原理的各種實(shí)施例只是說(shuō)明,不應(yīng)該以任何方式解釋為限制本發(fā)明的范圍。參照附圖的下述描述用于幫助全面理解由權(quán)利要求及其等同物限定的本發(fā)明的示例性實(shí)施例。下述描述包括多種具體細(xì)節(jié)來(lái)幫助理解,但這些細(xì)節(jié)應(yīng)認(rèn)為僅僅是示例性的。因此,本領(lǐng)域普通技術(shù)人員應(yīng)認(rèn)識(shí)到,在不悖離本發(fā)明的范圍和精神的情況下,可以對(duì)本文中描述的實(shí)施例進(jìn)行多種改變和修改。此外,為了清楚和簡(jiǎn)潔起見(jiàn),省略了公知功能和結(jié)構(gòu)的描述。此外,貫穿附圖,相同附圖標(biāo)記用于相似功能和操作。
本發(fā)明公開(kāi)了一種用于執(zhí)行adagrad梯度下降算法的裝置,包括數(shù)據(jù)訪問(wèn)單元、指令緩存單元、控制器單元、數(shù)據(jù)緩存單元以及數(shù)據(jù)處理模塊。其中,數(shù)據(jù)訪問(wèn)單元能夠訪問(wèn)外部地址空間,可以向裝置內(nèi)部各個(gè)緩存單元讀寫(xiě)數(shù)據(jù),完成數(shù)據(jù)的加載和存儲(chǔ),具體包括向指令緩存單元讀取指令,從指定存儲(chǔ)單元之間讀取待更新參數(shù)和對(duì)應(yīng)的梯度值到數(shù)據(jù)處理單元,將更新后的參數(shù)向量從數(shù)據(jù)處理模塊直接寫(xiě)入外部指定空間;指令緩存單元通過(guò)數(shù)據(jù)訪問(wèn)單元讀取指令,并緩存讀入的指令;控制器單元從指令緩存單元中讀取指令,將指令譯碼為控制其他模塊行為的微指令并將其發(fā)送給其他模塊如數(shù)據(jù)訪問(wèn)單元、數(shù)據(jù)緩存單元、數(shù)據(jù)處理模塊等;數(shù)據(jù)緩存單元存儲(chǔ)裝置運(yùn)行中需要的一些中間變量,并對(duì)這些變量做初始化及更新操作;數(shù)據(jù)處理模塊根據(jù)指令做相應(yīng)的運(yùn)算操作,包括向量加法運(yùn)算、向量乘法運(yùn)算、向量除法運(yùn)算、向量平方根運(yùn)算及基本運(yùn)算。
根據(jù)本發(fā)明一實(shí)施例實(shí)現(xiàn)的adagrad梯度下降算法的裝置,可以用以支持使用adagrad梯度下降算法方面的應(yīng)用。在數(shù)據(jù)緩存單元開(kāi)辟一個(gè)空間存儲(chǔ)歷史梯度值的平方和,在每次進(jìn)行梯度下降時(shí),利用該平方和計(jì)算一個(gè)學(xué)習(xí)率,作為梯度下降的學(xué)習(xí)率,然后進(jìn)行對(duì)待更新向量的更新操作。重復(fù)進(jìn)行梯度下降操作,直至待更新向量收斂。
本發(fā)明還公開(kāi)了一種執(zhí)行adagrad梯度下降算法的方法,其具體實(shí)施步驟為:
通過(guò)指令,完成數(shù)據(jù)緩存單元的初始化操作,包括對(duì)常數(shù)α,ε設(shè)置初值以及對(duì)歷史梯度平方和
通過(guò)io指令,完成數(shù)據(jù)訪問(wèn)單元從外部空間讀取待更新參數(shù)向量和對(duì)應(yīng)的梯度向量的操作。
數(shù)據(jù)處理模塊根據(jù)相應(yīng)指令,讀取并計(jì)算更新數(shù)據(jù)緩存單元中的歷史梯度平方和
數(shù)據(jù)處理模塊根據(jù)相應(yīng)的指令,利用自適應(yīng)學(xué)習(xí)率及當(dāng)前梯度值完成對(duì)待更新向量的更新操作,更新操作計(jì)算公式如下:
其中,wt表示當(dāng)前(第t次)的待更新參數(shù),δl(wt)表示當(dāng)前待更新參數(shù)的梯度值,wt+1表示更新后的參數(shù),也是下一次(t+1次)迭代運(yùn)算的待更新參數(shù)。
數(shù)據(jù)處理單元判斷更新后的參數(shù)向量是否收斂,若收斂,運(yùn)算結(jié)束,否則,轉(zhuǎn)到步驟(2)處繼續(xù)執(zhí)行。
下面將結(jié)合附圖對(duì)本發(fā)明的具體方案進(jìn)行進(jìn)一步的闡述說(shuō)明。
圖1示出了根據(jù)本發(fā)明一實(shí)施例的用于實(shí)現(xiàn)adagrad梯度下降算法的裝置的整體結(jié)構(gòu)的示例框圖。如圖1所示,該裝置包括數(shù)據(jù)訪問(wèn)單元1、指令緩存單元2、控制器單元3、數(shù)據(jù)緩存單元4和數(shù)據(jù)處理模塊5,均可以通過(guò)硬件實(shí)現(xiàn),包括但不限于fpga、cgra、專用集成電路asic、模擬電路和憶阻器等。
數(shù)據(jù)訪問(wèn)單元1能夠訪問(wèn)外部地址空間,可以向裝置內(nèi)部各個(gè)緩存單元讀寫(xiě)數(shù)據(jù),完成數(shù)據(jù)的加載和存儲(chǔ)。具體包括向指令緩存單元2讀取指令,從指定存儲(chǔ)單元之間來(lái)回讀取待更新參數(shù)到數(shù)據(jù)處理單元5,從外部指定空間讀入梯度值到數(shù)據(jù)緩存單元4,將更新后的參數(shù)向量從數(shù)據(jù)處理模塊5直接寫(xiě)入外部指定空間。
指令緩存單元2通過(guò)數(shù)據(jù)訪問(wèn)單元1讀取指令,并緩存讀入的指令。
控制器單元3從指令緩存單元2中讀取指令,將指令譯碼成控制其他模塊行為的微指令并將其發(fā)送給其他模塊如數(shù)據(jù)訪問(wèn)單元1、數(shù)據(jù)緩存單元3、數(shù)據(jù)處理模塊5等。
數(shù)據(jù)緩存單元4在裝置初始化時(shí),初始化歷史梯度值的平方和
數(shù)據(jù)處理模塊5從數(shù)據(jù)緩存單元4中讀取歷史梯度值的平方和
圖2示出了根據(jù)本發(fā)明實(shí)施例的用于實(shí)現(xiàn)adagrad梯度下降算法相關(guān)應(yīng)用的裝置中數(shù)據(jù)處理模塊的示例框圖。如圖2所示,數(shù)據(jù)處理模塊包括運(yùn)算控制子模塊51、并行向量加法運(yùn)算單元52、并行向量乘法運(yùn)算單元53、并行向量乘法運(yùn)算單元54、并行向量平方根運(yùn)算單元55以及基本運(yùn)算子模塊56。由于adagrad梯度下降算法中向量運(yùn)算均為element-wise運(yùn)算,同一向量執(zhí)行某種運(yùn)算時(shí),不同位置元素可以并行執(zhí)行運(yùn)算。
圖3示出了根據(jù)adagrad梯度下降算法進(jìn)行相關(guān)運(yùn)算的裝置的總體流程圖。
在步驟s1,在指令緩存單元2的首地址處預(yù)先存入一條io指令。
在步驟s2,運(yùn)算開(kāi)始,控制單元3從指令緩存單元2的首地址讀取該條io指令,根據(jù)譯出的微指令,數(shù)據(jù)訪問(wèn)單元1從外部地址空間讀取所有與adagrad梯度下降計(jì)算有關(guān)的所有指令,并將其緩存入指令緩存單元2中。
在步驟s3,控制器單元4從指令緩存單元2讀入賦值指令,根據(jù)譯出的微指令,數(shù)據(jù)緩存單元中的歷史梯度平方和
在步驟s4,控制器單元3從指令緩存單元2讀入一條io指令,根據(jù)譯出的微指令,數(shù)據(jù)訪問(wèn)單元1從外部空間讀取待更新參數(shù)向量wt和對(duì)應(yīng)的梯度向量δl(wt)讀入到數(shù)據(jù)緩存單元4中。
在步驟s5,控制器單元3從指令緩存單元2讀入一條數(shù)據(jù)傳輸指令,根據(jù)譯出的微指令,數(shù)據(jù)緩存單元4中的歷史梯度平方和
在步驟s6,控制器單元從指令緩存單元2讀入一條向量指令,根據(jù)譯出的微指令,進(jìn)行歷史梯度平方和
在步驟s7,控制器單元從指令緩存單元2讀取一條指令,根據(jù)譯出的微指令,更新后的歷史梯度平方和
在步驟s8,控制器單元從指令緩存單元2讀取一條自適應(yīng)學(xué)習(xí)率運(yùn)算指令,根據(jù)譯出的微指令,運(yùn)算控制子模塊51控制相關(guān)運(yùn)算模塊進(jìn)行如下操作:利用向量平方根并行運(yùn)算子模塊55計(jì)算
在步驟s9,控制器單元從指令緩存單元2讀取一條參數(shù)向量更新指令,根據(jù)譯出的微指令,驅(qū)動(dòng)運(yùn)算控制子模塊51進(jìn)行如下的運(yùn)算:利用向量乘法并行運(yùn)算單元子模塊52計(jì)算出
在步驟s10,控制器單元從指令緩存單元2讀取一條io指令,根據(jù)譯出的微指令,更新后的參數(shù)向量wt+1從數(shù)據(jù)處理單元5通過(guò)數(shù)據(jù)訪問(wèn)單元1傳送至外部地址空間指定地址。
在步驟s11,控制器單元從指令緩存單元2讀取一條收斂判斷指令,根據(jù)譯出的微指令,數(shù)據(jù)處理單元判斷更新后的參數(shù)向量是否收斂,若收斂,運(yùn)算結(jié)束,否則,轉(zhuǎn)到步驟s5處繼續(xù)執(zhí)行。
前面的附圖中所描繪的進(jìn)程或方法可通過(guò)包括硬件(例如,電路、專用邏輯等)、固件、軟件(例如,被承載在非瞬態(tài)計(jì)算機(jī)可讀介質(zhì)上的軟件),或兩者的組合的處理邏輯來(lái)執(zhí)行。雖然上文按照某些順序操作描述了進(jìn)程或方法,但是,應(yīng)該理解,所描述的某些操作能以不同順序來(lái)執(zhí)行。此外,可并行地而非順序地執(zhí)行一些操作。
在前述的說(shuō)明書(shū)中,參考其特定示例性實(shí)施例描述了本發(fā)明的各實(shí)施例。顯然,可對(duì)各實(shí)施例做出各種修改,而不悖離所附權(quán)利要求所述的本發(fā)明的更廣泛的精神和范圍。相應(yīng)地,說(shuō)明書(shū)和附圖應(yīng)當(dāng)被認(rèn)為是說(shuō)明性的,而不是限制性的。