TSP問題從DP算法到深度學習4:概率最大狀態序列算法

2021-02-07 MyEncyclopedia

本篇是TSP問題從DP算法到深度學習系列第四篇,這一篇我們會詳細舉例並比較在 seq-to-seq 或者Markov Chain中的一些常見的搜索概率最大的狀態序列的算法。這些方法在深度學習的seq-to-seq 中被用作decoding。在第五篇中,我們使用強化學習時也會使用了本篇中講到的方法。

TSP問題從DP算法到深度學習1:遞歸DP方法 AC AIZU TSP問題

TSP問題從DP算法到深度學習2:歐氏空間數據集的DP解

TSP問題從DP算法到深度學習3:Pointer Network

馬爾科夫鏈問題

在 seq-to-seq 問題中,我們經常會遇到需要從現有模型中找概率最大的可能狀態序列。這類問題在機器學習算法和控制領域廣泛存在,抽象出來可以表達成馬爾可夫鏈模型:給定初始狀態的分布和系統的狀態轉移方程(稱為系統動力,dynamics),找尋最有可能的狀態序列。

舉個例子,假設系統有

狀態轉移矩陣由

至此,系統的所有參數都定下來了。接下去的各個時刻的狀態分布可以通過矩陣乘法來算得。比如,記

 

矩陣左乘行向量可以理解為矩陣每一行的線性組合,直覺上理解為下一時刻的狀態分布是上一時刻初始狀態分布乘以轉移關係的線性組合。

同樣的,後面每一個時刻都可以由上一個狀態分布向量乘以

下面我們通過多種算法來找出由上述參數定義的系統中前三個時刻的最有可能序列,即概率最大的

窮竭搜索

若給定一條路徑,計算特定路徑的概率是很直接的,例如,若給定路徑為

因此,我們可以通過枚舉所有

下面是Python 3的窮竭搜索代碼,輸出為最有可能的概率及其路徑。樣例問題的輸出為 0.084 和狀態序列

def search_brute_force(initial: List, transition: List, L: int) -> Tuple[float, Tuple]:
    from itertools import combinations_with_replacement
    v = [0, 1, 2]
    path_all = combinations_with_replacement(v, L)

    max_prop = 0.0
    max_route = None
    prob = 0.0
    for path in list(path_all):
        for idx, v in enumerate(path):
            if idx == 0:
                prob = initial[v]  # reset to initial state
            else:
                prev_v = path[idx-1]
                prob *= transition[prev_v][v]
        if prob > max_prop:
            max_prop = max(max_prop, prob)
            max_route = path
    return max_prop, max_route


貪心搜索

窮竭搜索一定會找到最有可能的狀態序列,但是算法複雜度是指數級的

 

Python 3 實現中我們利用了 numpy 類庫,主要是 np.argmax() 可以讓代碼簡潔。代碼本質上是兩重循環,(一層循環是np.argmax中),對應時間算法複雜度是

def search_greedy(initial: List, transition: List, L: int) -> Tuple[float, Tuple]:
    import numpy as np
    max_route = []
    max_prop = 0.0
    states = np.array(initial)

    prev_max_v = None
    for l in range(0, L):
        max_v = np.argmax(states)
        max_route.append(max_v)
        if l == 0:
            max_prop = initial[max_v]
        else:
            max_prop = max_prop * transition[prev_max_v][max_v]
        states = max_prop * states
        prev_max_v = max_v

    return max_prop, max_route


Beam 搜索

貪心策略只考慮了下一步的最大概率狀態,若我們改進一下貪心策略,將下一步的最大

 

以下是Python 3 的代碼實現,利用了 PriorityQueue 選取

def search_beam(initial: List, transition: List, L: int, K: int) -> Tuple[float, Tuple]:
    N = len(initial)
    from queue import PriorityQueue
    current_q = PriorityQueue()
    next_q = PriorityQueue()

    from functools import total_ordering
    @total_ordering
    class PQItem(object):
        def __init__(self, prob, route):
            self.prob = prob
            self.route = route
            self.last_v = int(route[-1])

        def __eq__(self, other):
            return self.prob == other.prob

        def __lt__(self, other):
            return self.prob > other.prob

    for v in range(N):
        next_q.put(PQItem(initial[v], str(v)))

    for l in range(1, L):
        current_q = next_q
        next_q = PriorityQueue()
        k = K
        while not current_q.empty() and k > 0:
            item = current_q.get()
            prob, route, prev_v = item.prob, item.route, item.last_v
            k -= 1
            for v in range(N):
                nextItem = PQItem(prob * transition[prev_v][v], route + str(v))
                next_q.put(nextItem)

    max_item = next_q.get()

    return max_item.prob, list(map(lambda x: int(x), max_item.route))


Viterbi 動態規劃

和之前TSP 動態規划算法的思想一樣,最有可能狀態路徑問題解法有可以將指數時間複雜度

 

實現代碼中沒有返迴路徑本身而只是其概率值,目的是通過簡潔的三層循環來表達算法精髓。

def search_dp(initial: List, transition: List, L: int) -> float:
    N = len(initial)
    dp = [[0.0 for c in range(N)] for r in range(L)]
    dp[0] = initial[:]

    for l in range(1, L):
        for v in range(N):
            for prev_v in range(N):
                dp[l][v] = max(dp[l][v], dp[l - 1][prev_v] * transition[prev_v][v])

    return max(dp[L-1])


概率採用

以上所有的算法都是確定性的。在NLP 深度學習decoding 時候會帶來一個問題:確定性容易導致生成重複的短語或者句子。比如,確定性算法很容易生成如下句子。

This is the best of best of best of ...

一種簡單的方法是採用概率採用的方式迴避這個問題。也就是我們不尋找確定的局部最優或者全局最優的解,而是通過局部路徑或者全局路徑的概率信息進行採樣生成序列。例如,對於窮竭搜索的

def search_prob_greedy(initial: List, transition: List, L: int) -> Tuple[float, Tuple]:
    import random
    N = len(initial)
    max_route = []
    max_prop = 0.0
    vertices = [i for i in range(N)]
    prob = initial[:]

    for l in range(0, L):
        v_lst = random.choices(vertices, prob)
        v = v_lst[0]
        max_route.append(v)
        max_prop = prob[v]
        prob = [prob[v] * transition[v][v_target] for v_target in range(N)]

    return max_prop, max_route

相關焦點

  • 深度學習算法 | LSTM算法原理簡介及Tutorial
    LSTM(Long Short-Term Memory)算法作為深度學習方法的一種,在介紹LSTM算法之前,有必要介紹一下深度學習(Deep Learning)的一些基本背景。目前在機器學習領域,最大的熱點毫無疑問是深度學習,從谷歌大腦(Google Brain)的貓臉識別,到ImageNet比賽中深度卷積神經網絡的獲勝,再到Alphago大勝李世石,深度學習受到媒體、學者以及相關研究人員越來越多的熱捧。這背後的原因無非是深度學習方法的效果確實超越了傳統機器學習方法許多。從2012年Geoffrey E.
  • 深度強化學習算法與應用研究現狀綜述
    概述了基於值函數和策略梯度的兩類深度強化學習算法,詳細闡述了深度Q網絡、深度策略梯度及相關改進算法的原理,並綜述了深度強化學習在視頻遊戲、導航、多智能體協作以及推薦系統等領域的應用研究進展。最後,對深度強化學習的算法和應用進行展望,針對一些未來的研究方向和研究熱點給出了建議。
  • 基於深度學習OCR技術:端到端不定長文字識別CRNN算法詳解
    但是此法已經有點過時了,現在更流行的是基於深度學習的端到端的文字識別,即我們不需要顯式加入文字切割這個環節,而是將文字識別轉化為序列學習問題.雖然輸入的圖像尺度不同,文本長度不同,但是經過DCNN和RNN後,在輸出階段經過一定的翻譯後,就可以對整個文本圖像進行識別,也就是說,文字的切割也被融入到深度學習中去了。
  • 實驗三 遺傳算法解決TSP問題實驗
    2.利用遺傳求解函數優化問題,理解求解TSP問題的流程並測試主要參數對結果的影響。3.用遺傳算法對TSP問題進行了求解,熟悉遺傳算法的算法流程,證明遺傳算法在求解TSP問題時具有可行性。最短路徑問題旅行商問題(Travelling Salesman Problem , TSP),即最短路徑問題,就是在給定的起始點S到終止點T的通路集合中,尋求距離最小的通路,這樣的通路成為S點到T點的最短路徑。在尋找最短路徑問題上,有時不僅要知道兩個指定頂點間的最短路徑,還需要知道某個頂點到其他任意頂點間的最短路徑。
  • 機器學習算法地圖
    對於很多應用場景,我們無法得到準確的狀態模型和回報函數。因此前面介紹的這兩種算法在實際問題中使用價值有限。對於無法建立精確的環境模型的問題,我們只能根據一些狀態、動作、回報值序列樣本進行計算,估計出價值函數和最優策略。基本思想是按照某種策略嘗試執行不同的動作,觀察得到的回報,然後進行改進。
  • 【算法】隨機算法在數據智能和深度學習中有哪些應用?
    隨機漫步和布朗運動過程:用於交易算法。  馬爾可夫決策過程:常用於計算生物學和強化學習。高斯過程:用於回歸和優化問題(如,超參數調優和自動機器學習)。自回歸和移動平均過程:用於時間序列分析(如,ARIMA模型)。在本文中,我將簡要地向你介紹這些隨機過程。    歷史背景隨機過程是我們日常生活的一部分。
  • 數據結構與算法分析筆記——最大子序列和
    為方便計算,若序列所有整數均為負,則最大子序列和為0。例:對於輸入-2,11,-4,13,-5,-2,答案為20(從A2到A4)。算法1通俗的舉個例子,假設有兩個子序列,第一個子序列是從第2到第8個元素,第二個子序列是從第2到第9個元素,那麼,很顯然,第二個子序列的和為第一個子序列的和加上第9個元素。也就是說,算法1中,第三個循環通過元素逐個累加計算子序列的值是沒必要的,可以通過上一個子序列的結果直接得出。
  • 深度學習最常用的學習算法:Adam優化算法
    聽說你了解深度學習最常用的學習算法:Adam優化算法?-深度學習世界。深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam 算法正為此而生!
  • 澳門大學講座教授陳俊龍:從深度強化學習到寬度強化學習:結構,算法...
    下一個狀態 5 現在變成了當前狀態,因為狀態 5 是目標狀態,故算作完成了一次嘗試。智能體的大腦中現在包含了一個更新後的 Q 矩陣。對於下一次訓練,隨機選擇狀態 3 作為初始狀態。觀察 R 矩陣的第 4 行,有 3 個可能的動作,到達狀態 1,2 和 4。隨機選擇到達狀態 1 作為當前狀態的動作。
  • 深度學習的時間序列模型評價
    這些技術已經展現了希望對於建模靜態數據,如計算機視覺,把它們應用到時間序列數據正在獲得越來越多的關注。這次主要概述了時間序列數據存在的特殊挑戰,並提供了工作的評價,其含有把時間序列應用到非監督特徵學習算法或者是有選擇的促成特徵學習算法的變動去考慮目前時間序列數據的挑戰。當人們大腦在學習任務的時候,如語言、視覺和運動,時間是一種自然元素總是存在的。
  • 經典算法研究總結(5)-動態規划算法解最長公共子序列LCS問題
    下面,咱們運用此動態規划算法解此LCS問題。有一點必須聲明的是,LCS問題即最長公共子序列問題,它不要求所求得的字符在所給的字符串中是連續的(例如:輸入兩個字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它們的最長公共子序列,則輸出它們的長度4,並列印任意一個子序列)。
  • 算法工程師思維導圖 | 數據結構與算法
    該手冊一共分為數據結構與算法、數學基礎、統計機器學習和深度學習四個部分。點擊這裡查看具體使用指南。該手冊有兩種獲取方式:下面是數據結構與算法部分~數據結構二維矩陣/直方圖最大距形面積矩陣最大面積:https://leetcode-cn.com/problems/maximal-rectangle/solution/zui-da-ju-xing-by-leetcode/
  • 如何掌握動態規划算法的套路?
    簡單來來理解就是將一個大問題簡化成若干子問題,並存入一個表中,再根據數據表中子問題的解求出大問題的解。這種算法看上去是不是很熟悉?其實,動態規劃和分治算法類似,我們也常常將其和分治算法進行比較。它們都需要將其分解成若干子問題並求解子問題。
  • 《機器學習-原理、算法與應用》出版了
    結合SIGAI的「機器學習算法地圖」,「深度學習算法地圖」使用,效果更佳。如果完整的學習本書,可以讓你對機器學習和深度學習有全面而系統的理解。為了讓讀者理解數學公式,本書特意在第2章安排了數學知識的講解。2.深入淺出。寫書的目的是讓讀者能夠看到,且更容易看懂,即將複雜的問題簡單化,而不是相反。
  • 機器學習算法集錦:從貝葉斯到深度學習及各自優缺點
    )深度學習(Deep Learning)支持向量機(Support Vector Machine)降維算法(Dimensionality Reduction Algorithms)聚類算法(Clustering Algorithms)基於實例的算法(Instance-based Algorithms)貝葉斯算法(Bayesian Algorithms)關聯規則學習算法(Association Rule
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!
  • 純享福利:5步公式推導隱馬前向概率算法
    拿機器學習的一個算法體會:文字描述的具體和公式符號的抽象緊接上篇,繼續分析,務必學習上篇
  • 算法有沒有價值觀?知乎內容推薦算法解析
    CRF 計算的是一種聯合概率,優化的是整個序列(最終目標),而不是將每個時刻的最優拼接起來。在 CRF 層,使用 viterbi 解碼算法從狀態 score 和轉移矩陣中解碼得到輸出狀態序列。BILSTM-CRF 模型同時結合了 LSTM 和 CRF 的優點,使得其在序列標註任務上具有極強的優勢。
  • 機器學習算法之隱馬爾可夫模型
    例如謂語(愛)之後的詞(學習)很有可能名詞這麼一種轉態改變的規則。用HMM的概念來說,我愛學習是觀測序列,詞語的詞性序列是一個狀態序列,詞性變化規則為狀態轉移矩陣(描述不同狀態相互轉換的概率)。(這裡我們直接定義了觀測序列為一段時間內,海藻的溼度的一個序列,隱含狀態為同一段時間內,天氣的狀態序列,我們假設一個盲人只能通過觸摸判斷海藻溼度來推測天氣這麼一個情景)在不同天氣下,觀測到海藻不同的溼度的概率是不同的
  • 從淺層模型到深度模型:概覽機器學習優化算法
    學習算法一直以來是機器學習能根據數據學到知識的核心技術。而好的優化算法可以大大提高學習速度,加快算法的收斂速度和效果。