Share
Embed
Transcript
24 slides
-
ࣗݾհ • ߐๆ (Naomine, Egawa) / ؾ͍ͮͨΒ 40 /
1ࣇͷύύ • େֶࡏֶதʹΞϧόΠτͰ IT ͷੈքʹɻԼ͚։ൃɺϑϦʔϥϯεͳͲΛ ܦͯɺݱࡏ Amazon Web Service Japan ʹͯ Technical Account Manager ͱ͍͏ϩʔϧʹैࣄɻ • ͜͜࠷ۙͰ͍ͬͯΔͷɺAWS, Docker, JavaʢStruts2...ʣ • AI σʔλαΠΤϯεະܦݧɻຊॻͷᶃΛಡΜͰ Deep Learning ͷ໘ന ͞ʹ֮ΊɺG ݕఆΛऔΔͳͲ͢Δɻ • ࠷ۙϋϚͬͨͷ Amazon Prime Video ͷ "Ϗοάόϯ˒ηΦϦʔ" 2 -
͜ͷεϥΠυ • 4 ষͷલʢ4.1~4.2ʣΛಡΜͰ͕ࣗཧղͨ͜͠ͱͷαϚϦͰ͢ɻ • 4 ষ word2vec ͷߴԽ •
4.1 word2vec ͷվྑᶃ • 4.2 word2vec ͷվྑᶄ • ϖʔδͰݴ͏ͱ 131 ʙ 160 Ͱ͢ɻ • ຊʹॻ͍͍ͯͳ͍͋·Γͳ͍Ͱ͢ɻ 3 -
3 ষͷ • ίʔύεͷޠኮ͕૿͑Δͱܭࢉ͕ݱ࣮తͰͳ͘ͳΔ ۩ମతʹҎԼͷ 2 Օॴ͕ϘτϧωοΫͱͳΔ • ೖྗͷ one-hot
දݱͱॏΈߦྻ Win ͷੵͷܭࢉ ˠ 4.1 અͰղܾ • தؒͱॏΈߦྻ Wout ͷੵ͓Αͼ Softmax ϨΠϠͷܭࢉ ˠ 4.2 અͰղܾ 4 -
4.1 EMBEDDING ϨΠϠ • ޠኮ͕૿͑Δͱ one-hot දݱͷϕΫτϧαΠζ͕૿͑Δ • ྫ͑ޠኮ͕ 100
ສͰதؒͷχϡʔϩϯΛ 100 ͱ͢Δͱɺೖྗ ͷ one-hot දݱͱॏΈߦྻ Win ͷੵҎԼͷΑ͏ʹͳΔ C (1 x 100ສ) dot Win (100ສ x 100) • ܭࢉྔͱͯ͠ O(n) 5 -
• ࢼ͠ʹ Python ͷϓϩϑΝΠϥͰ CPU ࣌ؒͱϝϞϦྔΛݟͯΈ Δɻ • αϯϓϧίʔυ 3
ষͷ࣮Λ؆ ུԽͨ͠ͷɻ • ʢࢀߟʣwin ͷॳظԽͰϝϞϦΛ ͍ͬͯΔ͕ɺ͜͜܁Γฦ࣮͠ߦ ͞Εͳ͍ͷͰແࢹ • ʢࢀߟʣdot ͰϝϞϦ૿͍͑ͯ ͳ͍ɻh ͕খ͍͔͞Β͔ʁ • dot ͷ CPU ͕࣌ؒ 84,674 φϊඵ 6 -
EMBEDDING ϨΠϠͱ • one-hot ϕΫτϧͱ Win ͷੵɺܕ௨Γʹܭࢉͨ͠Βେม͚ͩͲཁ͢ ΔʹɺWin ͔ΒಛఆͷߦΛൈ͖ग़͍ͯ͠Δ͚ͩɻ P.135
ͷਤ • ͳͷͰɺWin ͔Β୯ޠ ID ʹ֘͢ΔߦΛൈ͖ग़࣮͢ʹ͢Εߴ Խ͞ΕΔɻ͜ͷॲཧΛߦ͏ϨΠϠΛ Embedding ϨΠϠͱ໊͚Δɻ • Embedding ͱɺ୯ޠͷຒΊࠐΈʢword embeddingʣʹ༝དྷͯ͠ ͍ΔɻWin ͔Β୯ޠ ID ʹ֘͢ΔߦΛൈ͖ग़͢͜ͱɺ୯ޠͷີͳ ϕΫτϧදݱΛऔಘ͢Δ͜ͱͱಉ͡Ͱ͋Γɺ୯ޠͷີͳϕΫτϧදݱ ΛࣗવݴޠॲཧͷͰ୯ޠͷຒΊࠐΈͱݺͿͨΊɻ 7 -
NUMPY ʹΑΔ࣮ • W[2] W[5] ͷΑ͏ʹྻͷΠϯσοΫεͷΑ͏ʹऔΔ͚ͩͰߦ͕ ൈ͖ग़ͤΔɻ • idx
= np.array([1, 0, 3, 0]) W[idx] ͱ͢ΕɺෳͷߦΛ·ͱΊͯൈ͖ग़͢͜ͱͰ͖Δɻ ˞ϛχόον࣮ߦΛఆ 8 -
• dot Λ [] ʹஔ͖͑ͯ࠶ϓϩ ϑΝΠϧΛऔͬͯΈͨɻ • 8 φϊඵʹͳͬͨɻ dot
ͱൺֱͯ͠ 5 ܻͷߴԽɻ • ʢࢀߟʣڥ AWS ͷ m5.large (vCPU x 2 / Memory 8GB / GPU ͳ͠) • ʢࢀߟʣܭࢉྔͱͯ͠ O(n) ͕ O(1) ʹͳͬͨɻ 9 -
FORWARD ͱ BACKWARD • ୯ޠ ID ͷϦετΛ self.idx ʹྻͰड͚औΔ༷ͱ͢Δɻ •
forward ͜͜·Ͱઆ໌ͨ͠ͱ͓ΓॏΈ͔ΒߦΛൈ͖ग़͚ͩ͢ɻ P.137 ͷਤ • def forward(self, idx): W, = self.params self.idx = idx out = W[idx] return out 10 -
• 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 -
• 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 -
൪֎ฤ • Python ͷ for loop ΑΓ Numpy ͷΈࠐΈϝ ιουͷ΄͏͕͍ɺͱ
ॻ͔Ε͍ͯΔͷͰɺͪ͜ Βܭଌͯ͠ΈΑ͏ɻ • 1 ສճͷ loop Λൺֱ͠ ͯΈΔɻ • 8,689+15,091 φϊඵ͕ 1,694 φϊඵʹͳͬͨɻ 13 -
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 -
• ͦ͜Ͱɺѻ͏Λଟ߲ྨ͔Βೋྨมߋ͢Δɻ • ͜Ε·ͰɺʮίϯςΩετͱͯ͠ 2 ͭͷ୯ޠΛ༩͑ͨͱ͖ʹɺͦͷؒʹ͘ Δ୯ޠͲΕͰ͠ΐ͏ʁʯͱ͍͏ɺෳͷબࢶͷத͔Β 1 ͭΛબͼग़͢ ͩͬͨɻ
ˠ ଟ߲ྨ • ͜ΕΛɺʮίϯςΩετͱͯ͠ 2 ͭͷ୯ޠΛ༩͑ͨͱ͖ʹɺͦͷؒʹ͘Δ୯ ޠ͜ΕͰ͔͢ʁʯͱ͍͏ɺYes/No Ͱ͑ΒΕΔʹ͢Δɻ ˠ ೋྨ • ೋྨͰ͋Εɺޠኮͷ͚ͩ͋Δग़ྗ͔Βਖ਼ղͰ͋Δ୯ޠ 1 ͭʹର͢ ΔείΞΛֶश͢ΕΑ͍ͷͰɺଞͷ୯ޠͷܭࢉΛল͘͜ͱ͕Ͱ͖Δɻ P.143 ͷਤ 15 -
• ೋྨͳͷͰɺग़ྗʹγάϞΠυؔΛ͏ɻ • ଟ߲ྨͰɺਖ਼ղͷ୯ޠͷείΞΛ্͛Δͱಉ࣌ʹɺෆਖ਼ղͷ୯ޠͷείΞΛԼ͛Δ Α͏ʹֶश͠ͳ͚ΕͳΒͳ͍ͷͰɺιϑτϚοΫεؔΛ͏ඞཁ͕͋ͬͨɻೋ߲ ྨͰ 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 -
NUMPY ʹΑΔ࣮ • ॏΈ Wout ͔Β୯ޠ ID ʹ֘͢ΔϕΫτϧΛऔΓग़͠ɺதؒͷ χϡʔϩϯ h
ͱͷੵΛܭࢉ͢Δɻ h (1 x 100) dot Wout(i) (100 x 1) • ຊॻͰɺEmbedding ϨΠϠΛ͍·Θ͍ͯ͠Δɻ ˞ Wout ͷߦྻ͕࣮ͰೖΕସΘΔ͜ͱʹͳΔͷͰίʔυΛಡΉͱ ͖ʹҙ͢Δɻ • Embedding ϨΠϠͱ h ͱͷੵΛ·ͱΊͯߦ͏ Embedding Dot ϨΠ ϠΛ࡞Δɻ 17 -
FORWARD ͱ BACKWARD • Embedding ϨΠϠΛ͍ճؔ͢Ͱɺh ͱ Wout ͔Βൈ͖ग़ͨ͠ϕ Ϋτϧͷ
shape ͕ಉ͡ʹͳΔͨΊɺdot Ͱͳ͘ * ͱ sum ͰੵΛ ܭࢉ͍ͯ͠Δɻ • target_W = self.embed.forward(idx) out = np.sum(target_W * h, axis=1) 18 -
• 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 -
• ߦྻͱͯ͠ 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 -
͜͜·Ͱͷ • ਖ਼ղ͚ͩͰͳ͘ɺෆਖ਼ղֶश͠ͳ͚ΕͳΒͳ͍ɻ • ʮyouʯͱʮgoodbyeʯΛ༩͑ͨͱ͖ʹਖ਼ղʢਖ਼ྫʣͷʮsayʯͷείΞ͕ 1 ʹۙͮ ͘ͱಉ࣌ʹɺʮyouʯͱʮgoodbyeʯΛ༩͑ͨͱ͖ʹෆਖ਼ղʢෛྫʣͷʮhelloʯͷ είΞ͕ 0
ʹۙͮ͘Α͏ͳॏΈΛٻΊͳ͚ΕͳΒͳ͍ɻ • ͱ͍͑ɺશͯͷෛྫΛֶश͢ΔͷͰޠኮʹԠͯ͡ܭࢉྔ͕૿͑ͯ͠·͍ɺ͜ͷ ষͷతʹ͙ͦΘͳ͍ɻ • ͦ͜Ͱɺෛྫʹ͍ͭͯ̑ݸͱ͔̍̌ݸͱ͔ϐοΫΞοϓͯ͠ɺͦΕΛֶशʹ༻͍Δ ͜ͱʹ͢Δɻ P.154 ͷਤ • ͜Ε͕ Negative Sampling ͷҙຯɻ 21 -
αϯϓϦϯάͷख๏ • ෛྫΛͲͷΑ͏ʹαϯϓϦϯά͢Δ͔ʁ • ϥϯμϜʹαϓϦϯά͢ΔΑΓɺίʔύεͰΑ͘ΘΕΔ୯ޠΛ༻͍ͨ΄͏ ͕ྑ͍͜ͱ͕ΒΕ͍ͯΔɻ • ίʔύεͷग़ݱճΛϥϯμϜʹબग़͢Δࡍͷ֬ͱͯ͠༻͍Δɻྫ͑ શͯͷ୯ޠͷग़ݱճ͕ 100
͋Γɺ͋Δ̍ͭͷ୯ޠ͕ 25 ճग़ݱ͍ͯͨ͠Βɺ ͦͷ୯ޠ͕બΕΔ֬Λ 25% ʹ͍ͨ͠ɻ • ͞Βʹͻͱखؒɻ֬ͷ͍୯ޠͷ֬Λগ͚ͩ͋͛ͯ͠ΔɻͦͷͨΊɺ֤ ୯ޠͷग़ݱ֬Λ 0.75 ͯ͋͛͠Δɻ P'(wi ) = P(wi )0.75 ÷ Σ(j=1...n) P(wj )0.75 • 0.75ʹཧతͳࠜڌͳ͘ɺΛม͑ͯྑ͍ɻ 22 -
NEGATIVE SAMPLING ͷ࣮ • ෛྫͷαϯϓϧ self.sample_size ͰܾΊΔ • EmbeddingDot ϨΠϠͱ
SigmoidWithLoss ϨΠϠͷηοτΛɺਖ਼ ྫ༻ʹ̍ηοτɺෛྫ༻ʹ self.sample_size ηοτͭɻ • forward Ͱ֤ηοτʹதؒͷχϡʔϩϯΛ͠ɺฒྻͰޡࠩΛ ܭࢉ͢Δɻ͜Ε P.28 ͷ Repeat ϊʔυʹ૬͢Δɻ • backward ͰɺRepeat ϊʔυͷٯൖʹैͬͯޯΛՃࢉ͢Δɻ 24