假設在一場賽馬中有m匹馬參賽,令第i匹參賽馬獲勝的機率爲pi,若是第i匹馬獲勝,那麼機會收益爲oi比1,即在第i匹立刻每投資一美圓,若是贏了,會獲得oi美圓的收益,若是輸了,那麼回報爲0。php
有兩種流行的馬票:html
當b = a-1時,」a兌1「和」b賒1"兩種馬票的機會收益等價。例如,擲硬幣的公平機會收益倍數是2兌1或者1賒1。git
假設某馬民將所有資金分散購買全部參賽的馬匹的馬票,bi表示其下注在第i匹馬的資金佔總資金的比例,那麼bi>=0,。若是第i匹馬獲勝,那麼該馬民得到的回報是下注在i匹馬的資金的oi倍,而下注在其餘馬匹上的資金所有輸掉。因而,賽馬結束時,若是第i匹馬獲勝,那麼該馬民最終所得的資產爲原始財富乘以因子bioi,並且這樣發生的機率爲pi。github
從這裏能夠看到,若是馬民採起可是「showhand策略」,即每次都將全部資金所有投資出去,那麼該馬民的總體資產就取決於一個隨機變量bioi的速率(稱之爲累積因子),不斷累乘利潤。令Sn爲該馬民在第n場賽馬結束時的資產,則有:web
,其中是當第X匹馬獲勝時,馬民購買該只馬票所得收益的累積因子。shell
因此,相對收益是一個累積因子,若是馬民中了X馬票,那麼他的相對收益就是原始財富乘以該因子。安全
由上面對一場賽馬的相對收益公式定義可知,一場賽馬的雙倍率爲:網絡
假設賽馬的結果爲服從p(x)的獨立同分布序列,那麼該馬民在策略b之下的相對收益將以指數因子爲呈指數增加,即:app
證實過程以下:dom
因爲獨立的隨機變量的函數仍然是獨立的,從而也是獨立同分布的,由弱大數定律可得:
因而有:
因爲馬民的相對收益是按照方式增加,所以,接下來的問題是如何在全部投資組合策略b的集合中,尋找使得最大化的策略,以便獲得最快的雙倍率累計結果。
若是選擇b使得雙倍率達到最大值,那麼稱該值爲最優雙倍率:
上式中,b做爲隨機變量,做爲b的函數,在約束條件之下求其最大值。能夠寫入以下拉格朗日乘子函數而且改變對數的基底(不影響最大化b),則有:
關於bi求導獲得:
爲了求得最大值,令偏導數爲0,從而得出:
代入約束條件可得λ=-1,以及bi=pi。從而,咱們獲得b=p爲函數J(b)的駐點,即按照比例b=p下注是最優的策略,該策略也被稱爲Kelly策略。
由此,咱們獲得一個最優下注定理,即按比例下注是對數最優的,最優雙倍率的公式計算以下:
,而且當按比例的下注策略能夠達到該最大值。證實過程以下:
等號成立的充要條件是b=p,即馬民應該按照每匹馬獲勝的機率按比例分散地購買馬票。
考慮僅有兩匹馬參賽的特殊情形,假設馬1獲勝的機率爲p1,馬2獲勝的機率爲p2。假設兩匹馬的機會收益率均等(均爲2兌1方式),此時的最優下注策略爲按機率比例下注,即b1=p1,b2=p2。
此時最優雙倍率爲,按照這樣的增加率,將致使相對收益無限增加,。
至此,咱們證實了對於一系列獨立同分布的賽馬,若是馬民將所有現金反覆購買馬票而不是捂住現金不動,那麼按比例下注是相對收益增加最快的策略。
繼續考慮一種特殊情形,即關於某種分佈具備公平機會收益倍率的情形。換言之,除了知道以外,無其餘信息可用。此時,記,將其視爲參賽馬匹的一種機率密度函數(這是用來估計賽馬獲勝機率的所謂馬民法)。在此記號下,雙倍率能夠寫爲:
該方程給出了雙倍率在相對熵視角下的另外一種解釋:雙倍率是馬民法的估計到真是分佈的距離,與馬民下注策略到真是分佈的距離之間的差值。
因此,馬民要賺錢,只有當他的估計(由b表示)比馬民法所得的估計(由r表示)更好。上式才爲正數,相對收益纔會不斷增長。
考慮一種更特殊的情形是:若是每隻馬票的機會收益倍率爲m兌1,此時,機會收益均等,服從均勻分佈且最優雙倍率爲:
在此情形下能夠看到:雙倍率與熵率之和爲常數。
這就是雙倍率與熵率對偶守恆定律,即對於均勻的公平機會收益倍率,有:。
熵每減少一比特,馬民的收益就翻一番,在熵越小的比賽中,馬民的獲利越豐厚。
在實際的狀況中,馬民不必定會傾囊投資,通常來說,應當容許馬民有選擇地保留一部分現金。令b(0)爲原始財富中預留爲現金的比例,b(1),b(2),....,b(m)爲分別購買每匹馬的馬票的資金比例。那麼在賽事結束時,最終資產與原始財富的比例(即相對收益)爲:
此時的最優化策略依賴於機會收益,咱們分狀況討論:
這種狀況下,機會收益分佈爲,對於公平機會收益倍率,保留現金的選擇並不影響分析。由於咱們能夠在保留現金的狀況下按,i=1,2,...,m比例下注在第i匹馬獲得的效果是相同的,由於整個計算是等比例縮放的。因而,馬民到底保存多少現金沒有關係,能夠簡單理解爲總體馬民投入的錢減小了,多投多賺,少投少賺,依然是按比例下注策略最優。
這種狀況下,機會收益分佈爲,這種比賽的機會收益總體優於公平機會收益倍率的賽事,很有送錢給馬民的感受。因此,任何人都但願將所有資金都押進去而沒必要保留現金。在這種比賽中,依然是按比例下注策略最優。
這種狀況下,機會收益分佈爲,此情形更表明現實生活,這種狀況表明了賽馬組織在流程內作了手腳致使收益機會總和小於1。在此種賽馬中,馬民只應該用一部分資金買馬票,而將其餘的現金捂住,這是最起碼的策略。此時,按比例下注再也不是對數最優了。
Relevant Link:
《信息論基礎》阮吉壽著 - 第六章
假設馬民具備一些關於賽馬結果的成功和失敗的信息,例如,馬民或許擁有某些參賽馬匹的歷史記錄,那麼這些信息會如何影響最終的相對收益呢?
咱們將馬民獲得的邊信息定義爲互信息,將因該信息而致使的雙倍率的增量定義爲信息價值,接下來咱們來推導互信息與雙倍率增量之間的聯繫。
假設爲第X只馬票,它獲勝的機率爲p(x),機會收益率爲:o(x)兌1。設(X,Y)的聯合機率密度函數爲p(x,y)。用,表示已知信息Y的條件下的下注策略。此處理解爲當得知信息y的條件下,用來買第x只馬票的資金的比例。通常地,表示無條件下注策略。
設無條件和條件雙倍率分別爲:
再設雙倍率增益爲:
因爲得到某場賽馬X中邊信息Y而引發的雙倍率的增量知足:
下面來證實該定理。在具備邊信息的條件下,按照條件比例買馬票,即,那麼關於邊信息Y的條件雙倍率能夠達到最大值,因而:
,最右一步用到了貝葉斯機率分解公式。
通常地,當無邊信息時,最優雙倍率爲
,這和咱們前面討論的一致。
從而,因爲邊信息Y的存在而致使的雙倍率的增量爲:
從上面討論能夠看到,邊信息沒有改變雙倍率的指望值,只是改變了對賽馬結果X不肯定熵的取值,在守恆定律的做用下,邊信息給最終雙倍率帶來的增量,等價於邊信息給賽馬結果X不肯定性減低的熵值,即互信息。
毫無疑問,獨立的邊信息並不會提升雙倍率,只是下降賽馬結果X的不肯定熵。這也一個側面說明了最優雙倍率是一個理論最優值,和具體的過程和結果機率分佈X無關。
Relevant Link:
《信息論基礎》阮吉壽著 - 第六章
在賽馬中,邊信息最一般的表現形式是全部參賽馬匹在過去比賽中的表現(即歷史先驗知識),若是各場賽馬之間是獨立的,那麼這些信息毫無用途,可是若是假設各場賽馬構成的序列之間存在關聯關係,那麼只要容許使用之前比賽的記錄來決定新一輪賽馬的下注策略,就能夠計算出有效的雙倍率。
假設由各場賽馬結果組成的序列是一個隨機過程,假設每場賽馬的下注策略依賴於此前的各次比賽的結果,此時,具備均勻的公平機會收益倍率的比賽的最優雙倍率爲;
該最優雙倍率能夠在時達到。
當第n場賽馬結束時,馬民的相對收益變成:
且雙倍率(增加率指數)(假設爲m兌1方式)爲:
其中,是n場賽馬的平均熵。對於熵率爲的平穩過程,對上式兩邊取極限可得:
咱們再次看到了守恆定理,即熵率與雙倍率之和爲常數。
筆者思考:賽馬中的最優雙倍率策略,體現了一種絕對理性主義的策略思想,即每一步的決策都徹底遵循某種理性主義思辨的結果,不參雜任何主觀的臆斷因素,只要保證了這一點,那麼最終的收益結果就能夠達到一個理論最優值,和所參與的博弈遊戲過程都無關,無論過程當中勝敗如何,最終獲得的收益都是可預期的,且最優的。
咱們來看一個撲克牌博弈的例子,叫紅與黑。一副撲克牌分紅26張紅和26張黑,每一輪中從兩堆中隨機抽取一張,遊戲參與者須要猜想是紅色仍是黑色,直到全部牌發完。咱們假設該遊戲的機會收益爲2兌1,顯然,紅色和黑色出現的機率相同,這種遊戲是公平機會收益的。
接下來問題來了,你須要採起什麼遊戲策略,以此來博得最大的收益呢?
仔細分析一下就會發現,第一輪時,咱們沒有任何先驗知識,紅和黑的機率都是1/2,此後每一輪後,剩下的紅黑牌數量都會發生變化,因此對紅和黑的猜想機率也會不斷髮生變化,將整個遊戲看作是一個隨機過程,上一小節已經討論過,最優雙倍率策略爲,即不斷根據場上當前的機率p(Xi)來決定本輪的猜想策略。
考慮如下兩種下注方案:
上述兩種方案本質是等價的。用概括法來看,52張牌組成的全部序列中,第一張牌是紅色的全部序列剛好佔一半,因此方案2在第一輪賭紅色也是一半資金。以此類推。通常地,若是將種可能的序列視爲基本事件,那麼能夠驗證:對每一個基本事件下注資金,則全部下注的策略在任何場合都是與紅色與黑色在此場合出現的機率成比例。類比賭馬模型,咱們只將資金下注在可能的基本事件上,並且只下注在使得相對收益增加率是252的因子的觀測序列上,對於其餘序列分文不投,那麼,最終相對收益爲:
能夠看到,此回報並不依賴於具體的序列,這就像AEP中所說的,任何序列都有相同的回報,從這個角度來說,全部序列都是典型的。
Relevant Link:
《信息論基礎》阮吉壽著 - 第六章
爲了討論方便,假設英文的字母表由26個字母和空格共計27個字符構成。經過收集一些文本樣本,根據這些文本中的字符的經驗分佈創建英文詞頻模型。
在英文語料中,單字母出現的機率遠不是均勻的,例如:
雙字母也同樣遠不是均勻分佈,例如:
能夠利用這些雙字母出現的頻率來估計一個字母后面跟隨另外一個字母的機率,即字母表的二階機率轉移矩陣。
同理還能夠繼續增長step-size的長度,估計更高階的條件機率並創建更復雜的模型,可是,隨着step-size的增長,很快會遇到」機率空洞問題「。例如,創建三階的馬爾科夫逼近,必須估計條件機率p(xi | xi-1,xi-1,xi-3)的值,那麼整個三階機率轉移矩陣表就是一個274的巨大表格。這樣,要想獲得全部這些3階條件機率的精確估計,就必須引入百萬數量級的樣本。這在實際工程裏固然很難作到,不可能總能準備好那麼大量的樣本,因此這部分機率空洞的條件機率項就置零,可是置零又會致使整個句子的累乘式爲零,因此爲了解決這個問題,又引入平滑技術,相關的細節討論,這裏再也不展開,能夠參閱另外一篇文章。
須要注意的是,無論NLP中引入的什麼平滑技術,仍是後來發展處的詞向量嵌入等技術,對於NLP問題來講,咱們均可以藉助信息論的一個核心概念:」熵「來獲得很好的解釋。
N階Ngram詞頻模型是一種隨機逼近的方法(NLP中還有其餘隨機逼近方法),使用越高的階,模型的複雜度就越高,相應的對英文語料的逼近就越強。定量地度量所謂的逼近效果的方法就是不肯定熵,能夠這麼理解:隨着詞模型複雜度的增長,能夠捕獲到英文語料中的更多結構信息,且使得下一個字母的條件不肯定性變小,相應的,熵值也就越小。例如:
但須要明白的是,即便是4階模型,甚至工程師們最喜歡的5階模型(5-gram)也不能捕獲到英文的全部結構,答案很簡單,由於即便是5階模型,依然存在不小的不肯定熵。
爲了更形象說明上面的理論,咱們藉助香農在最先的論文中提到的一種對英文語料的簡單隨機逼近方法,來一塊兒看一下不一樣的階數,是如何影響語言模型的隨機逼近效果的。
用一個語料庫(例如一個樣本集合)爲道具,若構造二階模型:
筆者這裏用網絡安全裏常見的webshell語料庫爲例,下載連接在這裏。
# -*- coding: utf-8 -*- import os from random import choice def N_order_Markov_processes(order, path_list): finnal_sequence = "" # initial, choice a random file choice_file_path = choice(path_list) choice_file_path_content = open(choice_file_path).read() choice_file_path_word = choice(choice_file_path_content) finnal_sequence += choice_file_path_word # search another file for i in range(order): while True: choice_file_path = choice(path_list) choice_file_path_content_list = list(open(choice_file_path).read()) try: last_word_index = choice_file_path_content_list.index(choice_file_path_word) + 1 choice_file_path_word = choice_file_path_content_list[last_word_index:last_word_index + 1][0] finnal_sequence += choice_file_path_word break except Exception, e: continue return finnal_sequence def main(): path_list = [] ROOT_PATH = '/Users/zhenghan/Downloads/webshell-sample-master/php' for f in os.listdir(ROOT_PATH): if f == '.DS_Store': continue file_path = os.path.join(ROOT_PATH, f) path_list.append(file_path) # generate a 32 length sequence, which each word is an zero-order markov sequence finnal_sequence = "" for i in range(32): finnal_sequence += N_order_Markov_processes(1, path_list) print "finnal_sequence: ", finnal_sequence if __name__ == '__main__': main()
能夠看到,到5階的時候, 隨機逼近的結果開始出現了正確的php標籤,即開始漸漸捕獲到了語料庫中的一些結構信息。
Relevant Link:
https://github.com/ysrc/webshell-sample
下圖展現了一個webshell文件的截圖
若是要將這類plain text文件輸入機器學習模型,就須要進行向量化特徵工程,但問題是如何進行向量化呢?本章咱們來對比兩種主流的方法,並說明其優劣和原理。這兩種方法包括
上圖給出了ast-token的一個部分截圖,以幫助讀者創建直觀感覺。
評估方案自己的熵是一個比較抽象的目標,咱們尋找一個等價的問題,咱們將每種技術方案都想象成一我的,它們共同在參與一個博弈估計的遊戲。在此遊戲中,給嘉賓任意一個web文件(多是合法文件也多是非法webshell文件),隨機指定一個詞素(char或者ast-token)做爲初始化,並不斷讓嘉賓猜想下一個出現的詞素。
與賽馬的情形同樣,最優的博弈策略是與下一個詞素出現的條件機率成比例。猜對了詞素的機會收益是:
因爲一連串的分佈下注等價於下注一個序列的全部項,所以,在n個詞素以後可獲得全部的收益總額爲:
因而,通過n論下注,相對收益的對數指望知足下式:
此處是不一樣方案下,詞素的熵率。因而和是兩種方案各自的熵率的上界。
若是假設webshell文本是遍歷的,且參賽嘉賓使用最優雙倍率策略(即最大後驗機率估計),那麼其上界估計依機率收斂於各自的熵率,即:
進一步的,又由於熵率的上界爲:H(X) <= log|X|。
因此,綜上所述,ast-token-based的特徵工程方式,要比char-based的方案熵率要小,即不肯定度更小,在相同的訓練樣本狀況下,ast-token-based方式能夠得到理論上更好的效果。
互信息的公式以下:
,它定義了X含有Y的信息量。
這裏X就是不一樣方案中的特徵向量,而Y就是label標籤位。能夠這麼理解,經過輸入特徵向量,能多大程度下降對未知label標籤的模糊程度。
這項評估也很簡單,能夠在特徵工程階段進行,在開始實際訓練以前,咱們確定都有一份帶標籤的特徵向量訓練集。經過對X和Y進行相關性分析,能夠獲得一個互信息的量化度量。一個好的技術方案,其特徵向量和待預測標籤之間的互信息應該是很高的。
這裏舉一個虛構的具體例子說明,假設你的訓練集裏有以下帶標籤的特徵向量數據。
.... [1,1,1,0,0,0] -> lable = 1 [0,0,0,1,1,1] -> lable = 1 ... [1,0,0,1,0,1] -> lable = 0 [0,1,1,0,1,0] -> lable = 0 ...
讀者注意到了嗎?上述訓練集中,出現了2對徹底相反的特徵向量,但同時其label又是相同的。這個現象怎麼理解呢?用熵的理論視角來看就是:
固然這是一個虛構的極端例子,現實工程中不會極端。但與其相似的場景卻家常便飯,筆者本身在項目中也曾經遇到過。固然緣由有不少,髒數據老是在所不免的,pure data在實際工程中是不多見的。
筆者這裏想告訴你們的是,在開始訓練以前,必定要關注數據自己的質量,若是訓練集自己對待預測目標的互信息很低,那麼無論投入多少理論研究資源,都是沒法突破理論上界,也不能拿到好的結果。
須要注意的是,圖像領域的問題由於自己具有幾個核心特性,於是特別適合於CNN卷積網絡,例如:
可是上述的這些特性,當面對的是網絡安全中的各種文本的時候,幾乎全都不適用。因此,在實際工程中使用最多的是RNN及其變體的長序列依賴模型,不少文本問題均可以轉化爲序列問題來建模和解釋。
Relevant Link:
https://www.cnblogs.com/LittleHann/p/11266085.html#_lab2_2_0