如何用C 實現自己的Tensorflow

2021-08-19 13:07:36 字數 1996 閱讀 9772

摘要:tensorflow是由谷歌基於distbelief進行研發的第二代人工智慧學習系統,其命名**於本身的執行原理,它完全開源,作者通過自己的乙個小專案,闡述了如何用c++實現自己的tensorflow,這篇文章看起來可能會有點晦澀,你需要對相關知識有所了解。以下是譯文。

在我們開始之前,以下是**:

branch with eigen backend

branch that only supports scalars

我和minh le一起做了這個專案。

為什麼?

如果你是cs專業的人員,可能聽過這句「不要使自己陷入_」的話無數次。cs有加密、標準庫、解析器等等。我覺得現在還應該包含ml庫。

不管事實如何,它仍然是乙個值得學習的驚人的教訓。人們現在認為tensorflow和類似的庫是理所當然的;把它們當成是乙個黑盒子,讓其執行。沒有多少人知道後台發生了什麼。這真是乙個非凸的優化問題!不要停止攪拌那堆東西,直到它看起來合適為止(結合下圖及機器學習系統知識去理解這句話)。

tensorflow

tensorflow是由google開源的乙個深度學習庫。在tensorflow的核心,有乙個大的元件,將操作串在一起,行成乙個叫做 運算子圖 的東西。這個運算子圖是乙個有向圖g=(v,e),在某些節點u1,u2,…,un,v∈v 和 e1,e2,…,en∈e,ei=(ui,v) 存在某些運算子將u1,…,un 對映到 v。

例如,如果我們有x + y = z,那麼 (x,z),(y,z)∈e 。

這對於評估算術表示式非常有用。我們可以通過尋找運算子圖中的 sinks來得到結果。 sinks是諸如 v∈v,∄e=(v,u)這樣的頂點。換句話說,這些頂點沒有到其它頂點的有向邊。同樣的, sources是v∈v,∄e=(u,v)。

對我們來說, 總是把值放在sources,值會傳播到sinks。

反向模式求導

如果認為我的解釋不夠好,這裡有一些幻燈片。

求導是tensorflow所需的許多模型的核心要求,因為需要它來執行 梯度下降演算法。每個高中畢業的人都知道什麼是求導; 它只是獲取函式的導數,如果函式是由基本函式組成的複雜組合,那麼就做 鏈式法則。

超級簡單的概述

如果有乙個這樣的函式:

f(x,y) = x * y

那麼關於x的求導將產生:

df(x,y)dx=y

關於y的求導將產生:

df(x,y)dy=x

另外乙個例子:

f(x1,x2,…,xn)=f(x)=xtx

這個導數是:

df(x)dxi=2xi

所以梯度就是:

∇xf(x)=2x

鏈式法則,譬如應用於複雜的函式f(g(h(x))):

df(g(h(x)))dx=df(g(h(x)))dg(h(x))dg(h(x))dh(x)dh(x)x

5分鐘內反向模式

x -> h -> g -> f

作為圖表。會給出答案f。但是,我們也可以採取反向求解:

dx <- dh <- dg <- df

這看起來像鏈式法則!需要將導數相乘在一起,以獲得最終結果。

下圖是乙個運算子圖的例子:

所以這基本上退化成圖遍歷問題。 有誰發覺拓撲排序和dfs / bfs嗎?

所以要支援雙向拓撲排序的話,需要包含一組父節點和一組子節點,sinks是另乙個方向的sources, 反之亦然。

實施在開學之前,minh le和我開始設計這個專案。我們決定使用eigen 庫後台進行線性代數運算。它們有乙個稱為matrixxd的矩陣類。我們在這裡使用它。

每個變數節點由var類表示:

class var ;

struct var::impl{

public:

impl(const matrixxd&);

impl(op_type, const std::vector&);

matrixxd val;

op_type op;

std::vectorchildren;

std::vector

如何用C 實現棧

簡單定義 棧就是一種只允許在表尾進行插入和刪除操作的線性表 舉乙個生活中的例子 我在乙個儲物箱中,堆了一堆衣服,我的一件球衣在最下面,而我要拿這件衣服,就意味著我必須將上面的衣服全部拿出來才可以,但是由於箱子只有乙個口,我也只能從上面拿東西,心裡還默默想著,當初就不該將球衣早早的放進去,導致結果就是...

如何用 Node Vue 搭建自己的部落格

為什麼選擇使用 node vue 搭建自己部落格,而不使用如 wordpress 等成熟的模板呢?我們使用 node.js 自己寫介面,vue 做前端渲染,可以讓我們更了解乙個 從後台搭建到前端渲染的過程,形成乙個知識的閉環,可以更有效提公升我們工做效率。文章主要內容包括 伺服器搭建,ssl 證書配...

如何用Hexo Github建立自己的技術部落格

github官網。按照一般的 註冊登入執行就好了,不詳細說。安裝很簡單,一直下一步 git安裝教程 很多教程裡都說要配置環境變數,我本人安裝過5次左右的git,一次都沒有配過,但是要配置使用者名稱和郵箱,就是和github註冊的一樣 安裝成功你在桌面右鍵,就能看到 多了兩個 git命令 安裝node...