既不是符號求導,也不是數值求導,而是自動求導。
符號求導和數值求導比較好理解。 對於符號求導來說,最重要的是要在各個符號操作的地方,記下對導數的影響。然後使用鏈式法則 即可 例如舉一個例子: 顯然我們知道這個函式關於x的導數是 在Tensorflow里長這樣:(位於math_grad.py)
自動求導有點迷惑性,我覺得稱之為“半自動求導”可能好理解一些。 現有的深度學習框架,例如tf、mxnet、pytorch、caffe、theano,都是自動求導。 具體來說就是深度學習框架裡的每個op(op指的是最小的計算單元,caffe裡叫layer)都預先定義好了forward和backward(或者叫grad)兩個函式,這裡的backward也就是求導。 也就是說每個op的求導都是預先定義好的,或者說是人手推的。當你定義好了一個神經網路,深度學習框架將其解釋為一個dag(有向無環圖),dag裡每個節點就是op,從loss function這個節點開始,透過鏈式法則一步一步從後往前計算每一層神經網路的梯度,整個dag梯度計算的最小粒度就是op的backward函式(這裡是手動的),而鏈式法則則是自動的。 可以看看Does tensorflow use automatic or symbolic gradients?,以及tf、mxnet、pytorch、caffe新增一個op的過程。看完之後會更容易理解一些。
既不是符號求導,也不是數值求導,而是自動求導。
符號求導和數值求導比較好理解。 對於符號求導來說,最重要的是要在各個符號操作的地方,記下對導數的影響。然後使用鏈式法則 即可 例如舉一個例子: 顯然我們知道這個函式關於x的導數是 在Tensorflow里長這樣:(位於math_grad.py)
自動求導有點迷惑性,我覺得稱之為“半自動求導”可能好理解一些。 現有的深度學習框架,例如tf、mxnet、pytorch、caffe、theano,都是自動求導。 具體來說就是深度學習框架裡的每個op(op指的是最小的計算單元,caffe裡叫layer)都預先定義好了forward和backward(或者叫grad)兩個函式,這裡的backward也就是求導。 也就是說每個op的求導都是預先定義好的,或者說是人手推的。當你定義好了一個神經網路,深度學習框架將其解釋為一個dag(有向無環圖),dag裡每個節點就是op,從loss function這個節點開始,透過鏈式法則一步一步從後往前計算每一層神經網路的梯度,整個dag梯度計算的最小粒度就是op的backward函式(這裡是手動的),而鏈式法則則是自動的。 可以看看Does tensorflow use automatic or symbolic gradients?,以及tf、mxnet、pytorch、caffe新增一個op的過程。看完之後會更容易理解一些。