Корисник:MiaSandra/песак

С Википедије, слободне енциклопедије

Витербијев алгоритам представља алгоритам динамичког програмирања који служи за проналажење највероватније секвенце скривених стања, такозваног Витербијевог пута, која произилази из секвенце посматраних догађаја, посебно у контексту Марковљевих извора информација и Марковљевих скривених модела.

Алгоритам је нашао универзалну примену у декодирању конвулционих кодова, који се користе у ЦДМА и ГСМ дигиталним мобилним телефонима, дајлапдајлап модемима, сателитима, комуникацији у дубоком свемиру, и 802.11 бежичном ЛАНу. Такође је опште коришћен у препознавању говора, синтези говора, диаризацији,[1] рачунарској лингвистици и биоинформатици. На пример, код препознавања говора звучни сигнал се третира као посматрана секвенца догађаја, а ниска текста се сматра "скривеним узроком" звучног сигнала. Витербијев алгоритам проналази највероватнијју ниску текста за дати звучни сигнал.

Историја[уреди | уреди извор]

Витербијев алгоритам је добио име по Eндру Витербију, који га је предложио 1967 као декодирајући алгоритам конвулционих кодова за исправљање шума у дигиталној комуникацији.[2] Mеђутим, до независног открића алгоритма дошло је чак седам научника, међу којима и Нидлман и ВаншВагнер и Фишер.[3]

"Витербијев (пут, алгоритам)" је постао стандардни израз за примену алгоритама динамичког програмирања ради максимизације проблема који укључују вероватноћу.[3] На пример, у статичкој синтаксној анализи алгоритам динамичког програмирања може да се искористи за откривање једног највероватнијег бесмисленог члана ниске, који се назива „Витербијев члан“.[4][5][6]

Алгоритам[уреди | уреди извор]

Претпоставимо да нам је дат скривени Марковљев модел са следећим вредностима: стање простора , иницијална вероватноћа да је у стању и транзициона вероватноћа преласка из стања у стање . Рецимо да посматрамо излаз , највероватнија секвенца стања која производи опажање је дата рекурентним релацијама:[7]

Овде је вероватноћа највероватније секвенце стања одговорне за првих опсервација које имају за своје коначно стање. Витербијев пут се може реконструисати чувањем показивача који памте које стање је коришћено у другој једначини. Нека је функција која враћа вредност коришћену да се израчуна ако је , или ако је . Онда:

Овде користимо стандардну дефиницију аргумента максимума.
Сложеност овог алгоритма је .

Пример[уреди | уреди извор]

Посматрајмо село где су сви сељани или здрави или имају грозницу и једино сеоски лекар може да утврди ко има грозницу. Доктор дијагностификује грозницу тако што пита пацијенте како се осећају. Сељани само могу да одговоре да се осећају нормално, ошамућено или да им је хладно.

Доктор верује да се здравствено стање његових пацијената понаша као дискретан Марковљев ланац. Постоје два стања, "здрав" и "грозница", али доктор не може да их посматра директно, она су скривена од њега. Сваког дана постоји извесна могућност да ће пацијент рећи доктору да се осећа "нормално", "ошамућено" или да му је "хладно" у зависности од свог здравственог стања.

Опсервацијe (нормално, ошамућено, хладно) уз скривено стање (здрав, грозница) формирају скривени Марковљев модел и могу се представити у програмерском језику Пајтон на следећи начин:

states = ('Healthy', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Healthy': 0.6, 'Fever': 0.4}
transition_probability = {
   'Healthy' : {'Healthy': 0.7, 'Fever': 0.3},
   'Fever' : {'Healthy': 0.4, 'Fever': 0.6}
   }
emission_probability = {
   'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
   'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6}
   }

У овом одломку кода start_probability представља лекарево уверење о томе у коме је стању скривеног Марковљевог модела био пацијент када га је први пут посетио (све што зна је да је пацијент иначе здрав). Конкретна дистрибуција вероватноће која се овде користи није еквилибријумска, која је (за дате вероватноће преласка) приближно {'Healthy': 0.57, 'Fever': 0.43}. transition_probability представља промену здравственог стања у Марковљевом ланцу. У овом примеру постоји само 30% шансе да ће пацијент сутра имати грозницу ако је данас здрав. Вероватноћа емисије представља вероватноћу како ће се пацијент осећати сваког дана. Ако је здрав, постоји 50% вероватноће да ће се осећати нормално, ако има грозницу постоји 60% вероватноће да се осећа ошамућено.

Graphical representation of the given HMM

Пацијент долази на преглед три дана за редом и доктор открива да се он првог дана осећао нормално, да му је другог дана хладно и да је трећег дана ошамућен. Доктор има питање: Која је највероватнија секвенца здравствених стања пацијента која би објаснила ове опсервације? Одговор на то даје Витербијев алгоритам.

def viterbi(obs, states, start_p, trans_p, emit_p):
    V = [{}]
    for st in states:
        V[0][st] = {"prob": start_p[st] * emit_p[st][obs[0]], "prev": None}
    # Run Viterbi when t > 0
    for t in range(1, len(obs)):
        V.append({})
        for st in states:
            max_tr_prob = max(V[t-1][prev_st]["prob"]*trans_p[prev_st][st] for prev_st in states)
            for prev_st in states:
                if V[t-1][prev_st]["prob"] * trans_p[prev_st][st] == max_tr_prob:
                    max_prob = max_tr_prob * emit_p[st][obs[t]]
                    V[t][st] = {"prob": max_prob, "prev": prev_st}
                    break
    for line in dptable(V):
        print line
    opt = []
    # The highest probability
    max_prob = max(value["prob"] for value in V[-1].values())
    previous = None
    # Get most probable state and its backtrack
    for st, data in V[-1].items():
        if data["prob"] == max_prob:
            opt.append(st)
            previous = st
            break
    # Follow the backtrack till the first observation
    for t in range(len(V) - 2, -1, -1):
        opt.insert(0, V[t + 1][previous]["prev"])
        previous = V[t][previous]["prev"]

    print 'The steps of states are ' + ' '.join(opt) + ' with highest probability of %s' % max_prob

def dptable(V):
    # Print a table of steps from dictionary
    yield " ".join(("%12d" % i) for i in range(len(V)))
    for state in V[0]:
        yield "%.7s: " % state + " ".join("%.7s" % ("%f" % v[state]["prob"]) for v in V)

Функција viterbi има следеће аргументе: obs је секвенца опсервација нпр ['normal', 'cold', 'dizzy']; states је скуп скривених стања; start_p је почетна вероватноћа; trans_p су вероватноће преласка; и emit_p су вероватноће емисије.

Ради једноставности кода претпоставимо да је секвенца опсервације obs непразна и да су trans_p[i][j] и emit_p[i][j] дефинисани за сва стања i,j.

У текућем примеру Витербијев алгоритам се користи на следећи начин:

viterbi(observations,
                   states,
                   start_probability,
                   transition_probability,
                   emission_probability)

Излаз је:

$ python viterbi_example.py
         0          1          2
Healthy: 0.30000 0.08400 0.00588
Fever: 0.04000 0.02700 0.01512
The steps of states are Healthy Healthy Fever with highest probability of 0.01512

Ово открива да су запажања ['normal', 'cold', 'dizzy'] највероватније генерисана од стања ['Healthy', 'Healthy', 'Fever']. Другим речима, с обзиром на уочене активности највероватније је да је пацијенткиња била здрава и првог дана када се осећала normal као и другог дана када се осећала cold, а онда је трећег дана добила грозницу, dizzy.

Рад Витербијевог алгоритма се може видети помочћу trellis дијаграма. Витербијев алгоритам је у суштини најкраћи пут кроз trellis дијаграм. Клинички пример за trellis дијаграм је показан на слици испод где је назначен одговарајући Витербијев пут.

Анимација trellis дијаграма за Витербијев алгоритам. После три дана највероватнији могући пут је ['Healthy', 'Healthy', 'Fever']

Приликом примене Витербијевог алгоритма треба напоменути да многи језици користе floating point аритметику -као нпр. p је мало слово, што може довести до поткорачења у резултатима. Уобичајена техника да се ово избегне је коришћење алгоритма вероватноће током обрачуна, истом техником која се користи у логаритамском бројчаном систему. Када се алгоритам заустави, прецизна вредност се може добити извођењем одговарајућег степеновања.

Екстензије[уреди | уреди извор]

Генерализација Витербијевог алгоритма, названа алгоритмом max-sum (алгоритам максималног производа) могу се користити да пронађу највероватније податке свих или неких подскупова латентних варијабли у великом броју графичких модела, Бајесове мреже, Марковљева случајна поља и условна случајна поља. Латентне варијабле треба да буду повезане на начин донекле сличан на HMM, са ограниченим бројем веза између варијабли и неке врсте линеарних структура између варијабли. Општи алгоритам обухвата пролазећу поруку и суштински је сличан алгоритму belief propagation. Који је генерално напред-назад алгоритам.

Алгоритам који се зове итеративно Витербијево декодирање може наћи секвенцу са запажањем која одговара најбоље (у просеку) датом HMM. Овај алгоритам је предложен од стране Qi Wang et al.[8] да би се решило са турбо кодом. Итеративно Витербијево декодирање ради помоћу итеративног позивања модификованог Витербијевог алгоритма, поново процењујући резултат filer до конвергенције.

Алтернативни алгоритам лењи Витербијев алгоритам, предложен је недавно. За многе кодексе практичног интереса, под разумним потешкоћама, лењи декодер (користећу лењи Витербијев алгоритам) је много бржи од оригиналног Витербијевог декодера (користећи Витербијев алгоритам). Овај алгоритам ради тако што не шири никакве чворове док заиста не буде потребно и обично успева да избегне пуно посла (у софтверу) од обичног Витербијевог алгоритма за исти резултат -медјутим није могуће то рећи и за хардвер.

Псеудокод[уреди | уреди извор]

С обзиром на простор за запажање , простор за могућа стања , секвенца запажања , транзициона матрица величине тако да чува транзициону вероватноћу стања у стање , емисиона матрица велицине тако да чува вероватноћу запажања стања , низ иницијалних вероватноћа величине тако да чува вероватноћу . Ми кажемо да је пут секвенца случаја који генеришу запажања .

У овом динамичком програмирању проблем смо конструисали у 2-димензионе табеле величине . Сваки елемент од , , чува вероватноћу највероватнијег пута до сада са који генерише . Сваки елемент из , чува , највероватнији пут до сада , за .

Пунимо уносе две табеле по растућем редоследу .

, и

Напоменути да не треба да се појави у другим изразима, јер је константа са и , и не утице на argmax.

INPUT
  • простор запажања ,
  • простор могућих стања ,
  • секвенца запажања тако да за тренутно запажање је ,
  • транзициона матрица величине тако да чува трануициону вероватноћу стања у стање ,
  • емисиона матрица величине тако да чува вероватноћу запажања стања ,
  • низ иницијалних вероватноћа величине тако да чува вероватноћу
OUTPUT
  • Највероватнија секвенца случаја је
 function VITERBI( O, S, π, Y, A, B ) : 
     for each state si do
         T1[i,1] ← πi·Biy1
         T2[i,1] ← 0
     end for
     for i2,3,...,T do
         for each state sj do
             
             
         end for
     end for
     
     xT ← szT
     for iT,T-1,...,2 do
         zi-1T2[zi,i]
         xi-1szi-1
     end for
     return 
 end function

Референце[уреди | уреди извор]

  1. ^ Xavier Anguera et Al, "Speaker Diarization: A Review of Recent Research", retrieved 19. August 2010, IEEE TASLP
  2. ^ 29 Apr 2005, G. David Forney Jr: The Viterbi Algorithm: A Personal History
  3. ^ а б Daniel Jurafsky; James H. Martin. Speech and Language Processing. Pearson Education International. стр. 246. 
  4. ^ Schmid, Helmut (2004). Efficient parsing of highly ambiguous context-free grammars with bit vectors (PDF). Proc. 20th Int'l Conf. on Computational Linguistics (COLING). doi:10.3115/1220355.1220379. 
  5. ^ Klein, Dan; Manning, Christopher D. (2003). A* parsing: fast exact Viterbi parse selection (PDF). Proc. 2003 Conf. of the North American Chapter of the Association for Computational Linguistics on Human Language Technology (NAACL). стр. 40—47. doi:10.3115/1073445.1073461. 
  6. ^ Stanke, M.; Keller, O.; Gunduz, I.; Hayes, A.; Waack, S.; Morgenstern, B. (2006). „AUGUSTUS: Ab initio prediction of alternative transcripts”. Nucleic Acids Research. 34: W435. doi:10.1093/nar/gkl200. 
  7. ^ Xing E, slide 11
  8. ^ Qi Wang; Lei Wei; Rodney A. Kennedy (2002). „Iterative Viterbi Decoding, Trellis Shaping,and Multilevel Structure for High-Rate Parity-Concatenated TCM”. IEEE Transactions on Communications. 50: 48—55. doi:10.1109/26.975743.