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