Theano2.1.1-基础知识之准备工作
來源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial
? ? 這里介紹的是使用theano的一些基礎知識,雖然theano是用來dl 的,不過其中的一些函數還是挺有用的,可以用在ml 里面。
? ? 在python或者ipython的交互模式下,可以按照如下形式來import theano:
>>> from theano import *? ? 這里有幾個你需要使用的符號都在theano的tensor這個子包中。讓我們首先導入這個子包,并給它賦值一個新的變量名比如 T :
>>> import theano.tensor as T? ? 如果這一步沒報錯,那么就可以準備接下來的教程了,不然還是回頭去安裝好theano吧(?Installing Theano),我的安裝過程。
? ? 在整個教程中,記得有一個術語表(?Glossary?,就在該博文下面這個目錄的下面)可以用來作為索引和模塊鏈接的。
下面是 theano basic tutorial的目錄(其中1、2、23節內容都在本頁,其他的另成一頁):
- 1、Python?簡單教程,下面是4個網頁鏈接,其中有經典的練習和書籍
-
- Python?的經典的挑戰游戲,完成一個網頁才能到達另一個網頁
- Dive into Python
- Google Python Class
- Enthought Python course?(free for academics)
- 2、NumPy?復習
- ? ? 2.1機器學習的矩陣約定
- 行表示水平方向,列表示豎直方向。每一行就是一個樣本。所以inputs[10,5] 就是一個有著10個樣本的矩陣,其中每個樣本的維度為5。如果這是一個NN的輸入,那么從輸入到第一層隱藏層的權重就表示為size (5, #hid)的矩陣。
考慮這樣一個數組:
>>> numpy.asarray([[1., 2], [3, 4], [5, 6]]) array([[ 1., 2.],[ 3., 4.],[ 5., 6.]]) >>> numpy.asarray([[1., 2], [3, 4], [5, 6]]).shape (3, 2)這是一個3*2的矩陣,即有3行2列。
訪問第3行(row#2)第1列(column #0)的元素:
>>> numpy.asarray([[1., 2], [3, 4], [5, 6]])[2, 0] 5.0這里需要注意的是,我們是從左到右,從上到下讀取的,所以一行是連續的,也就是3行2列。
2.2廣播(Broadcasting)
Numpy 會在算術操作的時候對不同形狀的數組進行廣播。也就是說更小的那個數組(或者標量)會廣播成對應的那個更大的數組,從而能夠進行數學計算。下面就是一個廣播的例子:
>>> a = numpy.asarray([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])更小的數組b?(實際上這里只是個標量, 可以看成是一個0d數組) 在這種情況下,在乘法運算中就會廣播成相同的size。該技巧通常用在簡化所寫的表達式上。?更多有關廣播的詳細細節請查看numpy user guide.
?
- 3、Baby Steps - Algebra翻譯
- 4、More Examples翻譯
- 5、Graph Structures翻譯
- 6、Printing/Drawing Theano graphs翻譯
- 7、Derivatives in Theano翻譯
- 8、Configuration Settings and Compiling Modes翻譯
- 9、Loading and Saving翻譯
- 10、Conditions翻譯
- 11、Loop翻譯
- 12、Sparse翻譯
- 13、Using the GPU翻譯
- 14、PyCUDA/CUDAMat/Gnumpy compatibility翻譯
- 15、Understanding Memory Aliasing for Speed and Correctness翻譯
- 16、How Shape Information is Handled by Theano翻譯
- 17、Debugging Theano: FAQ and Troubleshooting翻譯
- 18、Profiling Theano function翻譯
- 19、Extending Theano翻譯
- 20、Extending Theano with a C Op
- 21、Python Memory Management
- 22、Multi cores support in Theano翻譯
- 23、Frequently Asked Questions
- ? ??23.1如何更新權重的子集?
如果你只想要更新一個權重矩陣的子集(例如某些行,某些列),這種情況在每次迭代的前向傳播過程中會遇到。那么cost函數應該被定義成只依賴在這次迭代中當前權重子集的方式才行。
例如,如果你想要學習一個查找表,例如,在處理詞向量(word embedding)的時候,每一行的權重向量用來表示模型從一個單詞學到的embedding,在每次迭代中,那些唯一需要更新的行都是在前饋傳播中包含著embedding的。這里介紹下theano 函數應該如何來寫:
對查找表定義一個共享變量
>>> lookup_table = theano.shared(matrix_ndarray).通過傳遞所需要行或者列的整數索引向量來得到這個表的一個子集 (某些行或者某些列) .
>>> subset = lookup_table[vector_of_indices]從現在開始,使用 ‘subset’,而不會再調用 lookup_table[vector_of_indices] 了。這會造成梯度上的問題,因為這會生成新的變量
定義cost只依賴于subset而不是整個lookup_table:
>>> cost = something that depends on subset >>> g = theano.grad(cost, subset)有兩種方式來更新這些參數:使用inc_subtensor 或者set_subtensor。推薦使用 inc_subtensor。一些theano是在這兩者之間通過轉換來進行優化的,不過不是所有情況下都是如此:?
>>> updates = inc_subtensor(subset, g*lr) OR >>> updates = set_subtensor(subset, subset + g*lr)如果你不使用inc_subtensor或set_subtensor與其他類型的索引,那么我們只需要掌握這里的情況就可以了。
定義這個theano函數
>>> f=theano.function(..., updates=updates)注意到你可以計算cost函數關于整個lookup_table的梯度, 在前饋傳播過程中選取的行中會有非0行的梯度。 如果你使用梯度下降來進行更新這些參數,那么就不會有問題,除了不必要的計算,例如,你可能會使用許多梯度為0的行來更新這個查找表的參數。然而,如果你想要使用一個不同的優化方法比如rmsprop 或者 Hessian-Free 優化,那么就會有問題。在 rmsprop 中,你需要通過平方根除以當前的梯度(whose square root you divide the current gradient,不知道翻譯的對不對)來逐部分的逐步重新調整,從而保持一個指數衰減平方梯度(exponentially decaying squared gradient)。如果對應一個罕見單詞的查找表行的梯度經常出現0,那么對于這一行來說該梯度的平方將傾向于0,因為該行的衰減傾向于為0;使用Hessian-Free的話,你會得到許多的0行和0列,甚至它們中有些還是不可逆的。通常來說,只計算梯度關于在前饋傳播中實際用到的查找表的行會更好。
?Glossary(術語表)
Apply廣播這個機制允許有著不同數量維度的張量能夠應用在逐元素處理的情形下。它通過在缺失的維度的方向上將更小的張量進行復制來實現的。
更詳細的,可以看看Broadcasting in Theano vs. Numpy, 和 *?SciPy documentation about numpy’s broadcasting?*?OnLamp article about numpy’s broadcasting
一個有著不可變值的變量。例如,當你輸入如下:
>>> x = tensor.ivector() >>> y = x + 3那么在graph中就會創建一個常量3。
See also:?gof.Constant
兩個張量變量?M?和?N的一個逐元素操作 f 的形式如下:
f(M,?N)[i,?j]?==?f(M[i,?j],?N[i,?j])
換句話說,輸入矩陣中的每個元素是和其他矩陣對應位置上的元素相結合的。 當元素的坐標[i,?j]?沒有對應的時候,元素之間是沒有依賴關系的,所以逐元素操作就像是在幾個維度上的一個標量操作。?在不同維度張量上的逐元素操作可以通過?broadcasting?(廣播)更小的維度來實現。
?Variable?和 用來表示變量之間的符號函數關系的Apply?節點相連可以構成一個有向,無環集合。你可以通過定義表達式圖來使用theano,然后用?theano.function來對他們進行編譯。
See also?Variable,?Op,?Apply, 和?Type, 或者更多的可以看看?Graph Structures.
當計算一個或多個輸入需要被重寫要不然就會失效,那么該操作?Op?(對于某個具體的input[s])就是破壞性的。例如,inplace?操作就是破壞性的。不過破壞性的操作有時候比非破壞性的操作快很多。theano建議用戶不要將破壞性的操作放入graph中,然后給 ?theano.function?but 不過卻可以可以通過對優化插入破壞性的操作來優化。
破壞性的操作可以通過?destroy_map?的操作屬性來指明。 (See?gof.Op.
?一個?Apply??的?.op和它的符號輸入一起決定著在運行的時候,哪種計算方式會被使用。在theano中,例如加法?(T.add) 和索引?x[i]?這樣的數學上的函數都是操作。庫文檔中大部分都是用來描述不同的操作的,不過你可以自行添加其他的操作。
See also?Variable,?Type, 和?Apply, 更詳細的可以看?Graph Structures.
?Variable??.type?用來表示哪一種值會在編譯后的graph中被計算。繼承自Type的實例,用來作為一個變量?Variable.的.type屬性。
See also?Variable,?Op, 和?Apply, 更多可以看看Graph Structures.
這是你使用theano的時候主要用到的數據結構。例如:
>>> x = theano.tensor.ivector() >>> y = -x**2x?和?y?都是?Variables, 即,是Variable?這個類的實例。
See also?Type,?Op, and?Apply, 或者更詳細的可以看看?Graph Structures.
一些張量操作 (例如 Subtensor 和 Transpose) 可以通過簡單的對輸入重新索引來保持在常量時間內完成。從apply的實例得到輸出的這樣的操作被稱為?Views?是因為它們的存儲可能會被其他變量(apply的輸入)的存儲別名了. 對于theano來說,知道哪些變量是其他變量的views是很重要的,因為這樣就可以引入正確的?Destructive?操作.
View 操作是通過一個?view_map?操作屬性來表示的。 (See?gof.Op.
?
轉載于:https://www.cnblogs.com/shouhuxianjian/p/4564622.html
總結
以上是生活随笔為你收集整理的Theano2.1.1-基础知识之准备工作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八排序算法汇总
- 下一篇: Android AES加密算法,现在实际