ゼロから作るDeep Learning 2 自然言語編 読書会 第8回

ゼロから作るDeep Learning 2 自然言語編 読書会 第8回

317294d9b76dc4ebd537c351ec1d3976?s=128

naomine-egawa

July 24, 2019
Tweet

Transcript

  1. θϩ͔Β࡞ΔDEEP LEARNING 2 ࣗવݴޠฤ ಡॻձ ୈ8ճ

  2. ࣗݾ঺հ • ߐ઒௚ๆ (Naomine, Egawa) / ؾ͍ͮͨΒ 40 ୅ /

    1ࣇͷύύ • େֶࡏֶதʹΞϧόΠτͰ IT ͷੈքʹɻԼ੥͚։ൃɺϑϦʔϥϯεͳͲΛ ܦͯɺݱࡏ͸ Amazon Web Service Japan ʹͯ Technical Account Manager ͱ͍͏ϩʔϧʹैࣄɻ • ͜͜࠷ۙͰ࢖͍ͬͯΔ΋ͷ͸ɺAWS, Docker, JavaʢStruts2...ʣ • AI ΋σʔλαΠΤϯε΋ະܦݧɻຊॻͷᶃΛಡΜͰ Deep Learning ͷ໘ന ͞ʹ໨֮ΊɺG ݕఆΛऔΔͳͲ͢Δɻ • ࠷ۙϋϚͬͨ΋ͷ͸ Amazon Prime Video ͷ "Ϗοάόϯ˒ηΦϦʔ" 2
  3. ͜ͷεϥΠυ͸ • 4 ষͷલ൒ʢ4.1~4.2ʣΛಡΜͰࣗ෼͕ཧղͨ͜͠ͱͷαϚϦͰ͢ɻ • 4 ষ word2vec ͷߴ଎Խ •

    4.1 word2vec ͷվྑᶃ • 4.2 word2vec ͷվྑᶄ • ϖʔδͰݴ͏ͱ 131 ʙ 160 Ͱ͢ɻ • ຊʹॻ͍͍ͯͳ͍࿩͸͋·Γͳ͍Ͱ͢ɻ 3
  4. 3 ষͷ໰୊఺ • ίʔύεͷޠኮ਺͕૿͑Δͱܭࢉ͕ݱ࣮తͰ͸ͳ͘ͳΔ
 ۩ମతʹ͸ҎԼͷ 2 Օॴ͕ϘτϧωοΫͱͳΔ • ೖྗ૚ͷ one-hot

    දݱͱॏΈߦྻ Win ͷੵͷܭࢉ
 ˠ 4.1 અͰղܾ • தؒ૚ͱॏΈߦྻ Wout ͷੵ͓Αͼ Softmax ϨΠϠͷܭࢉ
 ˠ 4.2 અͰղܾ 4
  5. 4.1 EMBEDDING ϨΠϠ • ޠኮ਺͕૿͑Δͱ one-hot දݱͷϕΫτϧαΠζ͕૿͑Δ • ྫ͑͹ޠኮ਺͕ 100

    ສͰதؒ૚ͷχϡʔϩϯΛ 100 ͱ͢Δͱɺೖྗ ૚ͷ one-hot දݱͱॏΈߦྻ Win ͷੵ͸ҎԼͷΑ͏ʹͳΔ
 C (1 x 100ສ) dot Win (100ສ x 100) • ܭࢉྔͱͯ͠͸ O(n) 5
  6. • ࢼ͠ʹ Python ͷϓϩϑΝΠϥͰ CPU ࣌ؒͱϝϞϦྔΛݟͯΈ Δɻ • αϯϓϧίʔυ͸ 3

    ষͷ࣮૷Λ؆ ུԽͨ͠΋ͷɻ • ʢࢀߟʣwin ͷॳظԽͰϝϞϦΛ ࢖͍ͬͯΔ͕ɺ͜͜܁Γฦ࣮͠ߦ ͞Εͳ͍ͷͰແࢹ • ʢࢀߟʣdot ͰϝϞϦ͸૿͍͑ͯ ͳ͍ɻh ͕খ͍͔͞Β͔ʁ • dot ͷ CPU ͕࣌ؒ 84,674 φϊඵ 6
  7. EMBEDDING ϨΠϠͱ͸ • one-hot ϕΫτϧͱ Win ͷੵ͸ɺܕ௨Γʹܭࢉͨ͠Βେม͚ͩͲཁ͢ ΔʹɺWin ͔ΒಛఆͷߦΛൈ͖ग़͍ͯ͠Δ͚ͩɻ
 P.135

    ͷਤ • ͳͷͰɺWin ͔Β୯ޠ ID ʹ֘౰͢ΔߦΛൈ͖ग़࣮͢૷ʹ͢Ε͹ߴ଎ Խ͞ΕΔɻ͜ͷॲཧΛߦ͏ϨΠϠΛ Embedding ϨΠϠͱ໊෇͚Δɻ • Embedding ͱ͸ɺ୯ޠͷຒΊࠐΈʢword embeddingʣʹ༝དྷͯ͠ ͍ΔɻWin ͔Β୯ޠ ID ʹ֘౰͢ΔߦΛൈ͖ग़͢͜ͱ͸ɺ୯ޠͷີͳ ϕΫτϧදݱΛऔಘ͢Δ͜ͱͱಉ͡Ͱ͋Γɺ୯ޠͷີͳϕΫτϧදݱ Λࣗવݴޠॲཧͷ෼໺Ͱ͸୯ޠͷຒΊࠐΈͱݺͿͨΊɻ 7
  8. NUMPY ʹΑΔ࣮૷ • W[2] ΍ W[5] ͷΑ͏ʹ഑ྻͷΠϯσοΫεͷΑ͏ʹऔΔ͚ͩͰߦ͕ ൈ͖ग़ͤΔɻ • idx

    = np.array([1, 0, 3, 0])
 W[idx] ͱ͢Ε͹ɺෳ਺ͷߦΛ·ͱΊͯൈ͖ग़͢͜ͱ΋Ͱ͖Δɻ
 ˞ϛχόον࣮ߦΛ૝ఆ 8
  9. • dot Λ [] ʹஔ͖׵͑ͯ࠶౓ϓϩ ϑΝΠϧΛऔͬͯΈͨɻ • 8 φϊඵʹͳͬͨɻ
 dot

    ͱൺֱͯ͠ 5 ܻͷߴ଎Խɻ • ʢࢀߟʣ؀ڥ͸ AWS ͷ m5.large (vCPU x 2 / Memory 8GB / GPU ͳ͠) • ʢࢀߟʣܭࢉྔͱͯ͠͸ O(n) ͕ O(1) ʹͳͬͨɻ 9
  10. FORWARD ͱ BACKWARD • ୯ޠ ID ͷϦετΛ self.idx ʹ഑ྻͰड͚औΔ࢓༷ͱ͢Δɻ •

    forward ͸͜͜·Ͱઆ໌ͨ͠ͱ͓ΓॏΈ͔ΒߦΛൈ͖ग़͚ͩ͢ɻ
 P.137 ͷਤ • def forward(self, idx):
 W, = self.params
 self.idx = idx
 out = W[idx]
 return out 10
  11. • backward ͸ forward ͕ॏΈΛൈ͖ग़͚ͩ͢ͳͷͰɺޯ഑ʢdoutʣΛલͷ ૚ʹ໭͚ͩ͢ɻ
 dW ͷܗঢ়͸ม͑ͣʹɺશͯͷཁૉΛ 0 ʹ͔ͯ͠Βൈ͖ग़ͨ͠ͱ͜Ζʹޯ

    ഑Ληοτ͢Δɻ
 P.137 ͷਤ • def backward(self, dout):
 dW, = self.grads
 dW[...] = 0
 dW[self.idx] = dout
 return None • طʹ࣮૷͍ͯ͠Δ Optimizer ͱͷޓ׵ੑͷͨΊʹ dW ͸ W ͱಉ͡ܗঢ়ʹ ͍ͯ͠Δ͕ɺϝϞϦྔΛߟ͑Ε͹ idx ͱ dout Λอ͓͚࣋ͯͩ͘͠ͰΑ͍ɻ 11
  12. • backword ͷ࣮૷͸ɺ࣮͸͜ΕͰ͸μϝɻ • idx ʹॏෳ͕͋ͬͨ৔߹ɺطʹೖ͍ͬͯΔ஋্͕ॻ͖͞Εͯ͠·͏ɻ
 P.138 ͷਤ • ਖ਼ղ͸ɺidx

    ͕ࣔ͢ͱ͜Ζʹطʹ஋͕͋Ε͹ɺՃࢉ͢Δɻ
 "ͳͥՃࢉΛߦ͏͔͸ɺ֤ࣗͰߟ͑ͯΈ·͠ΐ͏" → ͦͷॏΈͷ߲͕ෳ਺͋ Δ͜ͱͱಉ͔ͩ͡Β • def backward(self, dout):
 dW, = self.grads
 dW[...] = 0
 for i, word_id in enumerate(self.idx):
 dW[word_id] += dout[i]
 return None 12
  13. ൪֎ฤ • Python ͷ for loop ΑΓ Numpy ͷ૊ΈࠐΈϝ ιουͷ΄͏͕଎͍ɺͱ

    ॻ͔Ε͍ͯΔͷͰɺͪ͜ Β΋ܭଌͯ͠ΈΑ͏ɻ • 1 ສճͷ loop Λൺֱ͠ ͯΈΔɻ • 8,689+15,091 φϊඵ͕ 1,694 φϊඵʹͳͬͨɻ 13
  14. 4.2 NEGATIVE SAMPLING • ޠኮ਺͕ 100 ສɺதؒ૚ͷχϡʔϩϯ਺͕ 100 ͷͱ͖ɺதؒ૚ͱॏ Έ

    Wout ͷੵ͸ҎԼͷΑ͏ʹͳΔɻ
 h (1 x 100) dot Wout (100 x 100ສ) • Softmax ϨΠϠͷܭࢉ͸ҎԼͷΑ͏ʹͳΔɻ
 exp(Sk ) ÷ Σ(i=1...100ສ) exp(Si )
 ※ k ൪໨ͷཁૉʢ୯ޠʣͷܭࢉࣜ • ͲͪΒ΋ܭࢉྔͱͯ͠͸ O(n) 14
  15. • ͦ͜Ͱɺѻ͏໰୊Λଟ߲෼ྨ͔Βೋ஋෼ྨ΁มߋ͢Δɻ • ͜Ε·Ͱ͸ɺʮίϯςΩετͱͯ͠ 2 ͭͷ୯ޠΛ༩͑ͨͱ͖ʹɺͦͷؒʹ͘ Δ୯ޠ͸ͲΕͰ͠ΐ͏ʁʯͱ͍͏ɺෳ਺ͷબ୒ࢶͷத͔Β 1 ͭΛબͼग़͢໰ ୊ͩͬͨɻ


    ˠ ଟ߲෼ྨ • ͜ΕΛɺʮίϯςΩετͱͯ͠ 2 ͭͷ୯ޠΛ༩͑ͨͱ͖ʹɺͦͷؒʹ͘Δ୯ ޠ͸͜ΕͰ͔͢ʁʯͱ͍͏ɺYes/No Ͱ౴͑ΒΕΔ໰୊ʹ͢Δɻ
 ˠ ೋ஋෼ྨ • ೋ஋෼ྨͰ͋Ε͹ɺޠኮͷ਺͚ͩ͋Δग़ྗ૚͔Βਖ਼ղͰ͋Δ୯ޠ 1 ͭʹର͢ ΔείΞΛֶश͢Ε͹Α͍ͷͰɺଞͷ୯ޠͷܭࢉΛল͘͜ͱ͕Ͱ͖Δɻ
 P.143 ͷਤ 15
  16. • ೋ஋෼ྨͳͷͰɺग़ྗ૚ʹ͸γάϞΠυؔ਺Λ࢖͏ɻ • ଟ߲෼ྨͰ͸ɺਖ਼ղͷ୯ޠͷείΞΛ্͛Δͱಉ࣌ʹɺෆਖ਼ղͷ୯ޠͷείΞΛԼ͛Δ Α͏ʹֶश͠ͳ͚Ε͹ͳΒͳ͍ͷͰɺιϑτϚοΫεؔ਺Λ࢖͏ඞཁ͕͋ͬͨɻೋ߲෼ ྨͰ͸ 1 ͭͷ୯ޠͷείΞ͕ਖ਼֬ʹͳΔΑ͏ʹֶश͢Ε͹Α͍ͷͰɺ1 ͭͷ୯ޠͷεί ΞΛಘΒΕΔؔ਺Ͱ͋Ε͹Α͍ɻ

    • ࠓճγάϞΠυؔ਺Λ࢖͏ཧ༝͸ɺ֬཰ͱΈͳͤΔͨΊɻ • ଛࣦؔ਺ʹ͸ަࠩΤϯτϩϐʔޡࠩΛ࢖͏ɻʢݱঢ়͔Βมߋͳ͠ʣ • ιϑτϚοΫεͷ৔߹ͱͰަࠩΤϯτϩϐʔޡࠩͷ͕ࣜҟͳΔ͕ɺଟ߲෼ྨͷग़ྗ૚ ʹ̎ͭͷʢyes/noΛද͢ʣχϡʔϩϯΛࢦఆͨ͠৔߹͸̎ͭͷ͕ࣜ׬શʹҰக͢Δɻ
 L = - Σ tk log yk ɾɾɾ (1.7) ɹP.20
 L = - (t log(y) + (1 - t) log (1 -y)) ɾɾɾ (4.3) ɹP.145
 ଟ߲෼ྨ͸ yes/no ͲͪΒ΋ 1 ʹऩଋͤ͞ΔͷͰ߲Λ෼͚Δඞཁ͕ͳ͍ɻ
 ιϑτϚοΫε͔ͩΒͲͪΒ͔̍ͭͷχϡʔϩϯͷޡࠩΛݟΔ͚ͩͰྑ͍ɻˡ ࣗ৴͸ͳ͍ɻ 16
  17. NUMPY ʹΑΔ࣮૷ • ॏΈ Wout ͔Β୯ޠ ID ʹ֘౰͢ΔϕΫτϧΛऔΓग़͠ɺதؒ૚ͷ χϡʔϩϯ h

    ͱͷੵΛܭࢉ͢Δɻ
 h (1 x 100) dot Wout(i) (100 x 1) • ຊॻͰ͸ɺEmbedding ϨΠϠΛ࢖͍·Θ͍ͯ͠Δɻ
 ˞ Wout ͷߦྻ͕࣮૷Ͱ͸ೖΕସΘΔ͜ͱʹͳΔͷͰίʔυΛಡΉͱ ͖ʹ஫ҙ͢Δɻ • Embedding ϨΠϠͱ h ͱͷੵΛ·ͱΊͯߦ͏ Embedding Dot ϨΠ ϠΛ࡞Δɻ 17
  18. FORWARD ͱ BACKWARD • Embedding ϨΠϠΛ࢖͍ճؔ͢܎Ͱɺh ͱ Wout ͔Βൈ͖ग़ͨ͠ϕ Ϋτϧͷ

    shape ͕ಉ͡ʹͳΔͨΊɺdot Ͱ͸ͳ͘ * ͱ sum Ͱ಺ੵΛ ܭࢉ͍ͯ͠Δɻ • target_W = self.embed.forward(idx)
 out = np.sum(target_W * h, axis=1) 18
  19. • backward ͸ "֤ࣗͰߟ͑ͯΈ·͠ΐ͏" ͱ͍͏͜ͱͰɺߟ͑ͯΈΔɻ MutMul ͷ backward ͰΑ͍͸ͣɻ •

    MutMul ͷ backward ͸ɺҎԼͷΑ͏ʹఆٛ͞ΕΔɻP.33
 y = x dot W ͷͱ͖ɺbackward ͸
 dx = dy dot Wt
 dW = xt dot dy • ࠓճ forward ͸ҎԼͷΑ͏ʹͳ͍ͬͯΔ͔Βɺ
 y (1 x 1) = h (1 x 100) dot Wout(i) (100 x 1) • backward ͸ҎԼͷͱ͓Γɻ
 dh = dy dot Wout(i) t 
 dW = ht dot dy 19
  20. • ߦྻͱͯ͠ shape Λॻ͖Ճ͑ͯΈΔͱ
 dh (1 x 100) = dy

    (1 x 1) dot Wout(i) t (1 x 100)
 dW (100 x 1) = ht (100 x 1) dot dy (1 x 1) • ͨͩࠓճͷ࣮૷Ͱ͸ h ͕طʹ Embedding ϨΠϠʹΑͬͯϕΫτϧʹ ͳ͍ͬͯΔ͠ɺWout(i) ΋ಉ༷ʹϕΫτϧ͔ͭཁૉ਺͸౳͍͠ͷͰɺҎ ԼͷΑ͏ʹॻ͖௚ͤΔɻ
 dh = dy (εΧϥ) * Wout(i)
 dW = h * dy (εΧϥ) • ͱ͍͏Θ͚ͰҎԼͷΑ͏ͳ࣮૷ʹͳ͍ͬͯΔɻP.150
 dtarget_W = dout * h
 dh = dout * target_W 20
  21. ͜͜·Ͱͷ໰୊఺ • ਖ਼ղ͚ͩͰͳ͘ɺෆਖ਼ղ΋ֶश͠ͳ͚Ε͹ͳΒͳ͍ɻ • ʮyouʯͱʮgoodbyeʯΛ༩͑ͨͱ͖ʹਖ਼ղʢਖ਼ྫʣͷʮsayʯͷείΞ͕ 1 ʹۙͮ ͘ͱಉ࣌ʹɺʮyouʯͱʮgoodbyeʯΛ༩͑ͨͱ͖ʹෆਖ਼ղʢෛྫʣͷʮhelloʯͷ είΞ͕ 0

    ʹۙͮ͘Α͏ͳॏΈΛٻΊͳ͚Ε͹ͳΒͳ͍ɻ • ͱ͸͍͑ɺશͯͷෛྫΛֶश͢ΔͷͰ͸ޠኮʹԠͯ͡ܭࢉྔ͕૿͑ͯ͠·͍ɺ͜ͷ ষͷ໨తʹ͙ͦΘͳ͍ɻ • ͦ͜Ͱɺෛྫʹ͍ͭͯ͸̑ݸͱ͔̍̌ݸͱ͔ϐοΫΞοϓͯ͠ɺͦΕΛֶशʹ༻͍Δ ͜ͱʹ͢Δɻ
 P.154 ͷਤ • ͜Ε͕ Negative Sampling ͷҙຯɻ 21
  22. αϯϓϦϯάͷख๏ • ෛྫΛͲͷΑ͏ʹαϯϓϦϯά͢Δ͔ʁ • ϥϯμϜʹαϓϦϯά͢ΔΑΓɺίʔύε಺ͰΑ͘࢖ΘΕΔ୯ޠΛ༻͍ͨ΄͏ ͕ྑ͍͜ͱ͕஌ΒΕ͍ͯΔɻ • ίʔύεͷग़ݱճ਺ΛϥϯμϜʹબग़͢Δࡍͷ֬཰෼෍ͱͯ͠༻͍Δɻྫ͑͹ શͯͷ୯ޠͷग़ݱճ਺͕ 100

    ͋Γɺ͋Δ̍ͭͷ୯ޠ͕ 25 ճग़ݱ͍ͯͨ͠Βɺ ͦͷ୯ޠ͕બ͹ΕΔ֬཰Λ 25% ʹ͍ͨ͠ɻ • ͞Βʹͻͱखؒɻ֬཰ͷ௿͍୯ޠͷ֬཰Λগ͚ͩ͋͛ͯ͠΍ΔɻͦͷͨΊɺ֤ ୯ޠͷग़ݱ֬཰Λ 0.75 ৐ͯ͋͛͠Δɻ
 P'(wi ) = P(wi )0.75 ÷ Σ(j=1...n) P(wj )0.75 • 0.75ʹཧ࿦తͳࠜڌ͸ͳ͘ɺ஋Λม͑ͯ΋ྑ͍ɻ 22
  23. • 0.75 ৐͢ΔΠϝʔδ • ࣮૷͸ UnigramSampler Ϋϥεʹ·ͱΊΒΕ͍ͯΔɻʢলུʣ 23

  24. NEGATIVE SAMPLING ͷ࣮૷ • ෛྫͷαϯϓϧ਺͸ self.sample_size ͰܾΊΔ • EmbeddingDot ϨΠϠͱ

    SigmoidWithLoss ϨΠϠͷηοτΛɺਖ਼ ྫ༻ʹ̍ηοτɺෛྫ༻ʹ self.sample_size ηοτ΋ͭɻ • forward Ͱ͸֤ηοτʹதؒ૚ͷχϡʔϩϯΛ౉͠ɺฒྻͰޡࠩΛ ܭࢉ͢Δɻ͜Ε͸ P.28 ͷ Repeat ϊʔυʹ૬౰͢Δɻ • backward Ͱ͸ɺRepeat ϊʔυͷٯ఻ൖʹैͬͯޯ഑ΛՃࢉ͢Δɻ 24