You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/ne/8-Reinforcement/1-QLearning/README.md

32 KiB

परिचय: रिइन्फोर्समेन्ट लर्निङ र Q-लर्निङ

मेसिन लर्निङमा रिइन्फोर्समेन्टको सारांश स्केच नोटमा

स्केच नोट: टोमोमी इमुरा

रिइन्फोर्समेन्ट लर्निङमा तीन महत्त्वपूर्ण अवधारणाहरू हुन्छन्: एजेन्ट, केही अवस्थाहरू, र प्रत्येक अवस्थाका लागि कार्यहरूको सेट। कुनै निर्दिष्ट अवस्थामा कार्य सम्पन्न गर्दा, एजेन्टलाई पुरस्कार दिइन्छ। फेरि सुपर मारियो खेलको कल्पना गर्नुहोस्। तपाईं मारियो हुनुहुन्छ, तपाईं खेलको स्तरमा हुनुहुन्छ, पहाडको छेउमा उभिएको। तपाईंको माथि सिक्का छ। तपाईं मारियो हुनुहुन्छ, खेलको स्तरमा, एक विशेष स्थानमा... यो तपाईंको अवस्था हो। दायाँतर्फ एक कदम चाल्नु (एक कार्य) तपाईंलाई पहाडबाट तल लैजान्छ, जसले तपाईंलाई कम अंक दिनेछ। तर, जम्प बटन थिच्दा तपाईंले अंक प्राप्त गर्नुहुनेछ र जीवित रहनुहुनेछ। यो सकारात्मक परिणाम हो र यसले तपाईंलाई सकारात्मक अंक दिनुपर्छ।

रिइन्फोर्समेन्ट लर्निङ र सिमुलेटर (खेल) प्रयोग गरेर, तपाईंले खेल खेल्न सिक्न सक्नुहुन्छ जसले तपाईंलाई जीवित रहन र सकेसम्म धेरै अंक प्राप्त गर्न मद्दत गर्दछ।

रिइन्फोर्समेन्ट लर्निङको परिचय

🎥 माथिको तस्बिरमा क्लिक गरेर दिमित्रीसँग रिइन्फोर्समेन्ट लर्निङको बारेमा सुन्नुहोस्।

पाठ अघि क्विज

पूर्वआवश्यकता र सेटअप

यस पाठमा, हामी Python मा केही कोड प्रयोग गरेर प्रयोग गर्नेछौं। तपाईंले यो पाठको Jupyter Notebook कोड आफ्नो कम्प्युटरमा वा क्लाउडमा चलाउन सक्षम हुनुपर्छ।

तपाईं पाठको नोटबुक खोल्न सक्नुहुन्छ र यस पाठलाई निर्माण गर्न अनुसरण गर्न सक्नुहुन्छ।

नोट: यदि तपाईं यो कोड क्लाउडबाट खोल्दै हुनुहुन्छ भने, तपाईंले rlboard.py फाइल पनि ल्याउनुपर्नेछ, जुन नोटबुक कोडमा प्रयोग गरिएको छ। यसलाई नोटबुकको समान डाइरेक्टरीमा राख्नुहोस्।

परिचय

यस पाठमा, हामी पिटर र ब्वाँसो को संसार अन्वेषण गर्नेछौं, जुन रुसी संगीतकार सर्गेई प्रोकोफिएभ द्वारा प्रेरित एक संगीत परी कथा हो। हामी रिइन्फोर्समेन्ट लर्निङ प्रयोग गरेर पिटरलाई उसको वातावरण अन्वेषण गर्न, स्वादिष्ट स्याउहरू सङ्कलन गर्न र ब्वाँसोसँग भेट्नबाट बच्न दिनेछौं।

रिइन्फोर्समेन्ट लर्निङ (RL) एउटा सिकाइ प्रविधि हो जसले हामीलाई कुनै एजेन्ट को कुनै वातावरण मा धेरै प्रयोगहरू चलाएर इष्टतम व्यवहार सिक्न अनुमति दिन्छ। यस वातावरणमा एजेन्टसँग केही लक्ष्य हुनुपर्छ, जुन पुरस्कार कार्य द्वारा परिभाषित हुन्छ।

वातावरण

सरलताका लागि, पिटरको संसारलाई width x height आकारको वर्गाकार बोर्ड मानौं, यस प्रकार:

पिटरको वातावरण

यस बोर्डको प्रत्येक कोष:

  • जमिन, जहाँ पिटर र अन्य प्राणीहरू हिँड्न सक्छन्।
  • पानी, जहाँ तपाईं स्पष्ट रूपमा हिँड्न सक्नुहुन्न।
  • रुख वा घाँस, जहाँ तपाईं आराम गर्न सक्नुहुन्छ।
  • स्याउ, जुन पिटरले आफूलाई खुवाउन पाउँदा खुशी हुने कुरा हो।
  • ब्वाँसो, जुन खतरनाक छ र यसबाट बच्नुपर्छ।

त्यहाँ छुट्टै Python मोड्युल rlboard.py छ, जसले यस वातावरणसँग काम गर्न कोड समावेश गर्दछ। किनभने यो कोड हाम्रो अवधारणाहरू बुझ्न महत्त्वपूर्ण छैन, हामी यसलाई आयात गर्नेछौं र नमूना बोर्ड सिर्जना गर्न प्रयोग गर्नेछौं (कोड ब्लक 1):

from rlboard import *

width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()

यस कोडले माथिको जस्तै वातावरणको चित्र प्रिन्ट गर्नुपर्छ।

कार्यहरू र नीति

हाम्रो उदाहरणमा, पिटरको लक्ष्य स्याउ फेला पार्नु हो, ब्वाँसो र अन्य अवरोधहरूबाट बच्दै। यो गर्न, ऊ स्याउ फेला पार्दासम्म वरपर हिँड्न सक्छ।

त्यसैले, कुनै पनि स्थानमा, ऊ निम्न कार्यहरू मध्ये एक चयन गर्न सक्छ: माथि, तल, बायाँ र दायाँ।

हामी ती कार्यहरूलाई शब्दकोशको रूपमा परिभाषित गर्नेछौं, र तिनीहरूलाई सम्बन्धित समन्वय परिवर्तनहरूको जोडीमा म्याप गर्नेछौं। उदाहरणका लागि, दायाँतर्फ सर्ने (R) जोडी (1,0) सँग मेल खानेछ। (कोड ब्लक 2):

actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }

यस परिदृश्यको रणनीति र लक्ष्यलाई संक्षेपमा भन्नुपर्दा:

  • रणनीति, हाम्रो एजेन्ट (पिटर) को, तथाकथित नीति द्वारा परिभाषित हुन्छ। नीति एउटा कार्य हो जसले कुनै पनि दिइएको अवस्थामा कार्य फिर्ता गर्दछ। हाम्रो अवस्थामा, समस्याको अवस्था बोर्डद्वारा प्रतिनिधित्व गरिन्छ, जसमा खेलाडीको वर्तमान स्थिति समावेश छ।

  • लक्ष्य, रिइन्फोर्समेन्ट लर्निङको, अन्ततः राम्रो नीति सिक्नु हो जसले हामीलाई समस्यालाई प्रभावकारी रूपमा समाधान गर्न अनुमति दिन्छ। यद्यपि, आधारभूत रूपमा, सबैभन्दा सरल नीति र्यान्डम वाक मानौं।

र्यान्डम वाक

हामी हाम्रो समस्यालाई र्यान्डम वाक रणनीति कार्यान्वयन गरेर समाधान गरौं। र्यान्डम वाकमा, हामी अनुमति दिइएका कार्यहरूबाट अर्को कार्यलाई अनियमित रूपमा चयन गर्नेछौं, जबसम्म हामी स्याउसम्म पुग्दैनौं (कोड ब्लक 3)।

  1. तलको कोड प्रयोग गरेर र्यान्डम वाक कार्यान्वयन गर्नुहोस्:

    def random_policy(m):
        return random.choice(list(actions))
    
    def walk(m,policy,start_position=None):
        n = 0 # number of steps
        # set initial position
        if start_position:
            m.human = start_position 
        else:
            m.random_start()
        while True:
            if m.at() == Board.Cell.apple:
                return n # success!
            if m.at() in [Board.Cell.wolf, Board.Cell.water]:
                return -1 # eaten by wolf or drowned
            while True:
                a = actions[policy(m)]
                new_pos = m.move_pos(m.human,a)
                if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
                    m.move(a) # do the actual move
                    break
            n+=1
    
    walk(m,random_policy)
    

    walk लाई कल गर्दा सम्बन्धित पथको लम्बाइ फिर्ता गर्नुपर्छ, जुन एक रनबाट अर्कोमा फरक हुन सक्छ।

  2. वाक प्रयोगलाई धेरै पटक (भन्नुहोस्, 100 पटक) चलाउनुहोस्, र परिणामस्वरूपको तथ्याङ्क प्रिन्ट गर्नुहोस् (कोड ब्लक 4):

    def print_statistics(policy):
        s,w,n = 0,0,0
        for _ in range(100):
            z = walk(m,policy)
            if z<0:
                w+=1
            else:
                s += z
                n += 1
        print(f"Average path length = {s/n}, eaten by wolf: {w} times")
    
    print_statistics(random_policy)
    

    ध्यान दिनुहोस् कि पथको औसत लम्बाइ लगभग 30-40 चरण हो, जुन धेरै हो, किनभने नजिकको स्याउसम्मको औसत दूरी लगभग 5-6 चरण हो।

    तपाईंले पिटरको र्यान्डम वाकको क्रममा उसको चाल कस्तो देखिन्छ भनेर पनि हेर्न सक्नुहुन्छ:

    पिटरको र्यान्डम वाक

पुरस्कार कार्य

हाम्रो नीतिलाई अझ बौद्धिक बनाउन, हामीले बुझ्नुपर्छ कि कुन चालहरू "अर्काभन्दा राम्रो" छन्। यो गर्न, हामीले हाम्रो लक्ष्य परिभाषित गर्नुपर्छ।

लक्ष्यलाई पुरस्कार कार्य को सन्दर्भमा परिभाषित गर्न सकिन्छ, जसले प्रत्येक अवस्थाको लागि केही स्कोर मान फिर्ता गर्दछ। संख्या जति उच्च हुन्छ, पुरस्कार कार्य त्यति राम्रो हुन्छ। (कोड ब्लक 5)

move_reward = -0.1
goal_reward = 10
end_reward = -10

def reward(m,pos=None):
    pos = pos or m.human
    if not m.is_valid(pos):
        return end_reward
    x = m.at(pos)
    if x==Board.Cell.water or x == Board.Cell.wolf:
        return end_reward
    if x==Board.Cell.apple:
        return goal_reward
    return move_reward

पुरस्कार कार्यहरूको रोचक कुरा यो हो कि अधिकांश अवस्थामा, हामीलाई खेलको अन्त्यमा मात्र महत्त्वपूर्ण पुरस्कार दिइन्छ। यसको मतलब हाम्रो एल्गोरिदमले सकारात्मक पुरस्कारमा पुग्न "राम्रो" चरणहरू सम्झनुपर्छ र तिनीहरूको महत्त्व बढाउनुपर्छ। त्यस्तै गरी, खराब परिणामतर्फ लैजाने सबै चालहरूलाई निरुत्साहित गर्नुपर्छ।

Q-लर्निङ

हामीले यहाँ छलफल गर्ने एल्गोरिदमलाई Q-लर्निङ भनिन्छ। यस एल्गोरिदममा, नीति एउटा कार्य (वा डेटा संरचना) द्वारा परिभाषित गरिन्छ जसलाई Q-टेबल भनिन्छ। यसले दिइएको अवस्थाको प्रत्येक कार्यको "राम्रोपन" रेकर्ड गर्दछ।

यसलाई Q-टेबल भनिन्छ किनभने यसलाई प्रायः तालिका वा बहु-आयामिक एरेको रूपमा प्रतिनिधित्व गर्न सुविधाजनक हुन्छ। किनभने हाम्रो बोर्डको आयाम width x height छ, हामी Q-टेबललाई width x height x len(actions) आकारको numpy एरेको रूपमा प्रतिनिधित्व गर्न सक्छौं: (कोड ब्लक 6)

Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)

ध्यान दिनुहोस् कि हामी Q-टेबलका सबै मानहरू समान मान (हाम्रो अवस्थामा - 0.25) बाट आरम्भ गर्छौं। यो "र्यान्डम वाक" नीतिसँग मेल खान्छ, किनभने प्रत्येक अवस्थामा सबै चालहरू समान रूपमा राम्रो हुन्छन्। हामी Q-टेबललाई बोर्डमा देखाउन plot कार्यलाई पास गर्न सक्छौं: m.plot(Q)

पिटरको वातावरण

प्रत्येक कोषको केन्द्रमा एउटा "तीर" हुन्छ जसले चालको प्राथमिक दिशा संकेत गर्दछ। किनभने सबै दिशाहरू समान छन्, एउटा बिन्दु देखाइएको छ।

अब हामीले सिमुलेशन चलाउन, हाम्रो वातावरण अन्वेषण गर्न, र Q-टेबल मानहरूको राम्रो वितरण सिक्न आवश्यक छ, जसले हामीलाई स्याउसम्मको बाटो धेरै छिटो फेला पार्न अनुमति दिनेछ।

Q-लर्निङको सार: बेलम्यान समीकरण

एकपटक हामीले चाल सुरु गरेपछि, प्रत्येक कार्यसँग सम्बन्धित पुरस्कार हुनेछ, अर्थात् हामी सैद्धान्तिक रूपमा उच्चतम तत्काल पुरस्कारको आधारमा अर्को कार्य चयन गर्न सक्छौं। तर, अधिकांश अवस्थाहरूमा, चालले हाम्रो स्याउसम्म पुग्ने लक्ष्य पूरा गर्दैन, र त्यसैले हामी तुरुन्तै कुन दिशा राम्रो हो भनेर निर्णय गर्न सक्दैनौं।

याद गर्नुहोस् कि तत्काल परिणाम महत्त्वपूर्ण छैन, बरु अन्तिम परिणाम महत्त्वपूर्ण छ, जुन हामीले सिमुलेशनको अन्त्यमा प्राप्त गर्नेछौं।

यो ढिलाइ भएको पुरस्कारलाई ध्यानमा राख्न, हामीले डाइनामिक प्रोग्रामिङ का सिद्धान्तहरू प्रयोग गर्न आवश्यक छ, जसले हामीलाई हाम्रो समस्यालाई पुनरावृत्त रूपमा सोच्न अनुमति दिन्छ।

मानौं हामी अहिले अवस्था s मा छौं, र हामी अर्को अवस्था s' मा जान चाहन्छौं। यसो गर्दा, हामीले तत्काल पुरस्कार r(s,a) प्राप्त गर्नेछौं, जुन पुरस्कार कार्यद्वारा परिभाषित गरिएको छ, साथै केही भविष्यको पुरस्कार। यदि हामी मानौं कि हाम्रो Q-टेबलले प्रत्येक कार्यको "आकर्षण" सही रूपमा प्रतिबिम्बित गर्दछ, भने अवस्था s' मा हामीले कार्य a' चयन गर्नेछौं, जसले Q(s',a') को अधिकतम मानसँग मेल खान्छ। यसरी, अवस्था s मा हामीले प्राप्त गर्न सक्ने सबैभन्दा राम्रो सम्भावित भविष्यको पुरस्कार max द्वारा परिभाषित हुनेछ।

नीति जाँच गर्दै

Q-Table ले प्रत्येक अवस्थामा प्रत्येक क्रियाको "आकर्षण" सूचीबद्ध गर्ने भएकाले, हाम्रो संसारमा प्रभावकारी नेभिगेसन परिभाषित गर्न यसलाई प्रयोग गर्न सजिलो छ। सबैभन्दा साधारण अवस्थामा, हामी Q-Table मा सबैभन्दा उच्च मानसँग सम्बन्धित क्रिया चयन गर्न सक्छौं: (कोड ब्लक 9)

def qpolicy_strict(m):
        x,y = m.human
        v = probs(Q[x,y])
        a = list(actions)[np.argmax(v)]
        return a

walk(m,qpolicy_strict)

माथिको कोडलाई धेरै पटक चलाउँदा, कहिलेकाहीं यो "अड्किन्छ" भन्ने देख्न सकिन्छ, र नोटबुकमा STOP बटन थिचेर यसलाई रोक्नुपर्छ। यस्तो किन हुन्छ भने, कहिलेकाहीं दुई अवस्थाले एकअर्कालाई "सर्वोत्तम Q-Value" को हिसाबले संकेत गर्न सक्छन्, जसले गर्दा एजेन्ट ती अवस्थाहरू बीच अनन्त रूपमा घुमिरहन्छ।

🚀चुनौती

कार्य 1: walk फङ्सनलाई परिमार्जन गरेर पथको अधिकतम लम्बाइलाई निश्चित चरणहरूको संख्याले (जस्तै, 100) सीमित गर्नुहोस्, र माथिको कोडले समय-समयमा यो मान फिर्ता ल्याएको हेर्नुहोस्।

कार्य 2: walk फङ्सनलाई परिमार्जन गरेर यसले पहिले नै पुगेको स्थानमा पुनः नजाने बनाउनुहोस्। यसले walk लाई लूप हुनबाट रोक्छ, तर एजेन्ट अझै पनि यस्तो स्थानमा "फस्न" सक्दछ जहाँबाट बाहिर निस्कन असमर्थ हुन्छ।

नेभिगेसन

प्रशिक्षणको क्रममा प्रयोग गरिएको नीति अझ राम्रो नेभिगेसन नीति हुनेछ, जसले शोषण र अन्वेषणलाई संयोजन गर्दछ। यस नीतिमा, हामी Q-Table मा रहेका मानहरूको अनुपातमा प्रत्येक क्रियालाई निश्चित सम्भावनाका साथ चयन गर्नेछौं। यो रणनीतिले अझै पनि एजेन्टलाई पहिले नै अन्वेषण गरिएको स्थानमा फर्कन सक्छ, तर तलको कोडबाट देख्न सकिन्छ कि यसले चाहिएको स्थानसम्म पुग्न औसत पथलाई धेरै छोटो बनाउँछ (याद गर्नुहोस् कि print_statistics ले 100 पटक सिमुलेशन चलाउँछ): (कोड ब्लक 10)

def qpolicy(m):
        x,y = m.human
        v = probs(Q[x,y])
        a = random.choices(list(actions),weights=v)[0]
        return a

print_statistics(qpolicy)

यो कोड चलाएपछि, तपाईंले पहिलेको भन्दा धेरै सानो औसत पथ लम्बाइ प्राप्त गर्नुहुनेछ, लगभग 3-6 को दायरामा।

सिकाइ प्रक्रियाको अनुसन्धान

जसरी हामीले उल्लेख गर्यौं, सिकाइ प्रक्रिया अन्वेषण र समस्या स्थानको संरचनाको बारेमा प्राप्त ज्ञानको अन्वेषणको बीचको सन्तुलन हो। हामीले देख्यौं कि सिकाइको परिणाम (एजेन्टलाई लक्ष्यसम्म छोटो पथ पत्ता लगाउन मद्दत गर्ने क्षमता) सुधार भएको छ, तर सिकाइ प्रक्रियाको क्रममा औसत पथ लम्बाइ कसरी व्यवहार गर्छ भन्ने हेर्न पनि रोचक छ:

सिकाइको सारांश:

  • औसत पथ लम्बाइ बढ्छ। सुरुमा औसत पथ लम्बाइ बढेको देखिन्छ। यसको कारण, जब हामी वातावरणको बारेमा केही थाहा पाउँदैनौं, हामी खराब अवस्थाहरू, पानी वा भेडियामा फस्न सक्छौं। जब हामी थप सिक्छौं र यो ज्ञान प्रयोग गर्न थाल्छौं, हामी वातावरणलाई लामो समयसम्म अन्वेषण गर्न सक्छौं, तर अझै पनि स्याउ कहाँ छन् भन्ने राम्रोसँग थाहा छैन।

  • पथ लम्बाइ घट्छ, जति हामी थप सिक्छौं। जब हामी पर्याप्त सिक्छौं, एजेन्टलाई लक्ष्य प्राप्त गर्न सजिलो हुन्छ, र पथ लम्बाइ घट्न थाल्छ। तर, हामी अझै पनि अन्वेषणका लागि खुला छौं, त्यसैले हामी प्रायः उत्तम पथबाट टाढा जान्छौं र नयाँ विकल्पहरू अन्वेषण गर्छौं, जसले पथलाई आदर्शभन्दा लामो बनाउँछ।

  • लम्बाइ अचानक बढ्छ। ग्राफमा देखिएको अर्को कुरा के हो भने कुनै बिन्दुमा लम्बाइ अचानक बढ्छ। यसले प्रक्रियाको स्टोकास्टिक प्रकृति संकेत गर्दछ, र कुनै बिन्दुमा हामी Q-Table को गुणांकलाई नयाँ मानहरूसँग ओभरराइट गरेर "बिगार्न" सक्छौं। यो आदर्श रूपमा सिकाइ दर घटाएर न्यूनतम गर्नुपर्छ (उदाहरणका लागि, प्रशिक्षणको अन्त्यतिर, हामी Q-Table को मानहरूलाई सानो मानले मात्र समायोजन गर्छौं)।

महत्त्वपूर्ण कुरा:

सिकाइ प्रक्रियाको सफलता र गुणस्तर सिकाइ दर, सिकाइ दरको क्षय, र डिस्काउन्ट फ्याक्टर जस्ता प्यारामिटरहरूमा धेरै निर्भर गर्दछ। यीलाई प्रायः हाइपरप्यारामिटरहरू भनिन्छ, जसले प्यारामिटरहरू बाट छुट्याउँछ, जुन हामी प्रशिक्षणको क्रममा अनुकूलित गर्छौं (जस्तै, Q-Table को गुणांकहरू)। उत्तम हाइपरप्यारामिटर मानहरू पत्ता लगाउने प्रक्रिया हाइपरप्यारामिटर अनुकूलन भनिन्छ, र यसले छुट्टै विषयको योग्य छ।

पोस्ट-व्याख्यान क्विज

असाइनमेन्ट

अझ यथार्थपरक संसार


अस्वीकरण:
यो दस्तावेज़ AI अनुवाद सेवा Co-op Translator प्रयोग गरेर अनुवाद गरिएको छ। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषामा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।