随机种子的理解
1、隨機數
在百度百科中對隨機數的定義為:
真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等,這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。
根據定義可以看到,真隨機數是依賴于物理隨機數生成器的。使用較多的就是電子元件中的噪音等較為高級、復雜的物理過程來生成。使用物理性隨機數發生器生成的真隨機數,可以說是完美再現了生活中的真正的“隨機”,也可以稱為絕對的公平。
2、偽隨機數
在百度百科中對偽隨機數的定義為:
真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分布概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是按照一定算法模擬產生的,其結果是確定的,是可見的。我們可以這樣認為這個可預見的結果其出現的概率是100%。所以用計算機隨機函數所產生的“隨機數”并不隨機,是偽隨機數。
從定義我們可以了解到,偽隨機數其實是有規律的。只不過這個規律周期比較長,但還是可以預測的。主要原因就是偽隨機數是計算機使用算法模擬出來的,這個過程并不涉及到物理過程,所以自然不可能具有真隨機數的特性。
3、隨機種子
計算機中產生的隨機數是偽隨機數,所謂的‘偽’,意思是這些數其實是有規律的,只不過因為算法規律太復雜,很難看出來而已。但是,再厲害的算法,如果沒有一個初始值,它也不可能憑空造出一系列隨機數來,我們說的種子就是這個初始值。
random隨機數是這樣生成的:我們將這套復雜的算法(是叫隨機數生成器吧)看成一個黑盒,把我們準備好的種子扔進去,它會返給你兩個東西,一個是你想要的隨機數,另一個是保證能生成下一個隨機數的新的種子,把新的種子放進黑盒,又得到一個新的隨機數和一個新的種子,從此在生成隨機數的路上越走越遠。
而在使用numpy時,就會運用到隨機種子,其代碼模板為
在有的博客的理解的困惑
(1)利用隨機種子后,每次生成的隨機數相同。這是什么意思?
(2)隨機數種子的參數怎么選擇?在別人的代碼中經常看到np.random.seed(Argument),這個參數不一樣,有的是0,有的是1,當然還有其他數。那這個參數應該怎么選擇呢?
通過 以下代碼做實驗:
運行結果為:
# 第一個while循環中的i <3 [[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]] [[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]] [[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]] # 第一個while循環中的i > 3 [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]] [[0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]] [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]] # 第二個while循環 [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]] [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]] # 單獨打印的(2,5)數組 [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215][ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]# 最后一個while [[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]] [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]] [[0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]] [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]] [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]] [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]] [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]] [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]通過該實驗我們可以得到以下結論:
a:兩次利用隨機數種子后,即便是跳出循環后,生成隨機數的結果依然是相同的。第一次跳出while循環后,進入第二個while循環,得到的兩個隨機數組確實和加了隨機數種子不一樣。但是,后面的加了隨機數種子的,八次循環中的結果和前面的結果是一樣的。說明,隨機數種子對后面的結果一直有影響。同時,加了隨機數種子以后,后面的隨機數組都是按一定的順序生成的。
b:在同樣的隨機種子后第六次的隨機數生成結果,兩行五列的數組和兩個一行五列的數組結果相同。說明,在生成多行隨機數組時,是由單行隨機數組組合而成的。
現在我們回答了第一個疑惑:利用隨機數種子,每次生成的隨機數相同。這是什么意思? --就是使后面的隨機數按一定的順序生成。
你可以實驗,在你的電腦上,當隨機數種子參數為0和1時,生成的隨機數和我上面高亮的結果相同。說明該參數指定了一個隨機數生成的起始位置。每個參數對應一個位置。并且在該參數確定后,其后面的隨機數的生成順序也就確定了。
所以,現在我們回答了我的第二個疑問:隨機數種子的參數怎么選擇?我認為隨意,這個參數只是確定一下隨機數的起始位置。
4、深度學習中的隨機種子
深度學習網絡模型中初始的權值參數通常都是初始化成隨機數,而使用梯度下降法最終得到的局部最優解對于初始位置點的選擇很敏感。為了能夠完全復現作者的開源深度學習代碼,隨機種子的選擇能夠減少一定程度上算法結果的隨機性,也就是更接近于原始作者的結果
即產生隨機種子意味著每次運行實驗,產生的隨機數都是相同的。但是在大多數情況下,即使設定了隨機種子,仍然沒有辦法完全復現作者paper中所給出的模型性能,這是因為深度學習代碼中除了產生隨機數中帶有隨機性,其訓練的過程中使用 mini-batch SGD或者優化算法進行訓練時,本身就帶有了隨機性。因為每次更新都是從訓練數據集中隨機采樣出batch size個訓練樣本計算的平均梯度,作為當前step對于網絡權值的更新值,所以即使提供了原始代碼和隨機種子,想要
復現作者paper中的性能也是非常困難的。
參考鏈接:
參考鏈接1
參考鏈接2
總結
- 上一篇: 2020最全蓝牙耳机盘点:年会最值得选择
- 下一篇: 数据结构笔记