{"id":345747,"date":"2023-02-21T09:02:57","date_gmt":"2023-02-21T09:02:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=345747"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2023-02-21T09:02:57","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=345747","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c GPT \u0432 60 \u0441\u0442\u0440\u043e\u043a NumPy (\u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435, 2\/2)<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/post\/716902\/\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0447\u0430\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439<\/a><\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT<\/h2>\n<p>  \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 <a href=\"https:\/\/arxiv.org\/pdf\/1706.03762.pdf\" rel=\"nofollow noopener noreferrer\">\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430<\/a>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/d1f\/eaa\/c78\/d1feaac787934e731622a62f8c6dbf48.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d1f\/eaa\/c78\/d1feaac787934e731622a62f8c6dbf48.png\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 \u0438\u0437 Attention is All You Need<\/i><\/p>\n<p>  \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 (\u043f\u0440\u0430\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/d01\/57c\/6ed\/d0157c6ed3d9f64e48888da5ef165098.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d01\/57c\/6ed\/d0157c6ed3d9f64e48888da5ef165098.png\"\/><\/div>\n<p>  <i>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT<\/i><\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043b\u043e\u0439 \u00ab\u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f\u00bb \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u043e\u0436\u0435 \u0443\u0431\u0440\u0430\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 + \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 <strong>\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438<\/strong><\/li>\n<li><strong>\u0421\u0442\u0435\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430<\/strong> \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430<\/li>\n<li>\u042d\u0442\u0430\u043f <strong>\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439<\/strong><\/li>\n<\/ul>\n<p>  \u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def gpt2(inputs, wte, wpe, blocks, ln_f, n_head):  # [n_seq] -> [n_seq, n_vocab]     # \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 + \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438     x = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]      # \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 n_layer     for block in blocks:         x = transformer_block(x, **block, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439     x = layer_norm(x, **ln_f)  # [n_seq, n_embd] -> [n_seq, n_embd]     return x @ wte.T  # [n_seq, n_embd] -> [n_seq, n_vocab]<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<h3>\u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438<\/h3>\n<p>  <\/p>\n<h4>\u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/h4>\n<p>  \u0421\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 ID \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b ID \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0438 <code>Apple = 5<\/code> \u0438 <code>Table = 10<\/code>, \u0442\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>2 * Table = Apple<\/code>). \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0439 <em>\u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e<\/em> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <a href=\"https:\/\/jaykmody.com\/blog\/attention-intuition\/#word-vectors-and-similarity\" rel=\"nofollow noopener noreferrer\">\u0441\u043b\u043e\u0432\u0430\u043c\u0438-\u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/a>, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432:<\/p>\n<pre><code class=\"python\">wte[inputs] # [n_seq] -> [n_seq, n_embd]<\/code><\/pre>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e <code>wte<\/code> \u2014 \u044d\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <code>[n_vocab, n_embd]<\/code>. \u041e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430, \u0433\u0434\u0435 i-\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0443 \u0434\u043b\u044f i-\u0442\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0435. \u0412 <code>wte[inputs]<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/numpy.org\/doc\/stable\/user\/basics.indexing.html#integer-array-indexing\" rel=\"nofollow noopener noreferrer\">\u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443 \u0432\u043e \u0432\u0432\u043e\u0434\u0435.<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438, <code>wte<\/code> \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043f\u0443\u0441\u043a\u0430.<\/p>\n<h4>\u041f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438<\/h4>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0435\u043c \u043d\u0430\u0448 \u0432\u0432\u043e\u0434, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0435\u0440\u043d\u0451\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u0432\u044b\u0432\u043e\u0434\u0435, \u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043b\u0438 \u0432\u0432\u043e\u0434 (\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0432\u043e\u0434\u043e\u0432 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434).<\/p>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0432 \u2014 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432:<\/p>\n<pre><code class=\"python\">wpe[range(len(inputs))] # [n_seq] -> [n_seq, n_embd]<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e <code>wpe<\/code> \u2014 \u044d\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <code>[n_ctx, n_embd]<\/code>. i-\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e i-\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>wte<\/code>, \u044d\u0442\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043f\u0443\u0441\u043a\u0430.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <code>n_ctx<\/code>. [\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f <a href=\"https:\/\/nlp.seas.harvard.edu\/2018\/04\/03\/attention.html#positional-encoding\" rel=\"nofollow noopener noreferrer\">\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433<\/a>, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u043e\u043b\u044c \u0436\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u043c\u0438, \u0447\u0442\u043e \u0438 \u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u043b \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c: \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0432\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430). \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0442\u0435\u0445 \u0434\u043b\u0438\u043d\u0430\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u043b\u0430\u0441\u044c. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0443\u0447\u0438\u0442\u044c GPT \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u0445 \u0434\u043b\u0438\u043d\u043e\u0439 1024 \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0430\u0445 \u0434\u043b\u0438\u043d\u043e\u0439 16 \u0442\u044b\u0441\u044f\u0447. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u043f\u0435\u0445\u043e\u0432 \u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/arxiv.org\/pdf\/2108.12409.pdf\" rel=\"nofollow noopener noreferrer\">Alibi<\/a> \u0438 <a href=\"https:\/\/arxiv.org\/pdf\/2104.09864v4.pdf\" rel=\"nofollow noopener noreferrer\">RoPE<\/a>] \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0435\u0440\u043d\u043e <code>len(inputs) &lt;= n_ctx<\/code>.<\/p>\n<h4>\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433<\/h4>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430\u0448 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433, \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.<\/p>\n<pre><code class=\"python\"># \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 + \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 x = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]      # x[i] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0441\u043b\u043e\u0432\u0430 \u0434\u043b\u044f i-\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 + \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 # \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0434\u043b\u044f i-\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0421\u0442\u0435\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430<\/h3>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u0441\u044f \u00ab\u0433\u043b\u0443\u0431\u0438\u043d\u0430\u00bb \u0433\u043b\u0443\u0431\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u041c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 <code>n_layer<\/code>.<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 n_layer for block in blocks:     x = transformer_block(x, **block, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]<\/code><\/pre>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u043e\u0451\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c <em>\u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439<\/em> \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GPT-3 \u0438\u043c\u0435\u0435\u0442 <a href=\"https:\/\/preview.redd.it\/n9fgba8b0qr01.png?auto=webp&amp;amp;s=e86d2d3447c777d3222016e81a0adfaec1a95592\" rel=\"nofollow noopener noreferrer\">\u0430\u0436 \u0446\u0435\u043b\u044b\u0445 96 \u0441\u043b\u043e\u0451\u0432<\/a>. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432\u044b\u0431\u043e\u0440 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>n_embd<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c <em>\u0448\u0438\u0440\u0438\u043d\u043e\u0439<\/em> \u0441\u0435\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GPT-3 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 12288).<\/p>\n<h3>\u041f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439<\/h3>\n<p>  \u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 \u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u044e:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439 x = layer_norm(x, **ln_f)  # [n_seq, n_embd] -> [n_seq, n_embd] return x @ wte.T  # [n_seq, n_embd] -> [n_seq, n_vocab]<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>x<\/code> \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u043e\u0439 <strong>\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f<\/strong>, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b GPT-2 (\u043e\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043e GPT \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0435).<\/li>\n<li>\u0414\u043b\u044f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b <strong>\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432<\/strong> <code>wte<\/code>. \u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 GPT \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0435\u0441\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438\u043c\u0435\u0435\u0442 \u043f\u0430\u0440\u0443 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432:\n<ul>\n<li>\u041c\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 GPT-3 \u044d\u0442\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e).<\/li>\n<li>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438 \u0437\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <em>\u0441\u043e<\/em> \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0438 <em>\u0438\u0437<\/em> \u0441\u043b\u043e\u0432, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043e\u043d\u0430 <em>\u043c\u043e\u0436\u0435\u0442<\/em> \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u043e\u0433\u0430\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0447\u0435\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446.<\/li>\n<\/ul>\n<\/li>\n<li>\u041c\u044b <strong>\u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c <code>softmax<\/code><\/strong> \u0432 \u043a\u043e\u043d\u0446\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 <a href=\"https:\/\/developers.google.com\/machine-learning\/glossary\/#logits\" rel=\"nofollow noopener noreferrer\">\u043b\u043e\u0433\u0438\u0442\u0430\u043c\u0438<\/a>, \u0430 \u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u0442 0 \u0434\u043e 1. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u043f\u0440\u0438\u0447\u0438\u043d:<br \/> \n<ul>\n<li><code>softmax<\/code> \u2014 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monotonic_function\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u0430\u044f<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>np.argmax(logits)<\/code> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 <code>np.argmax(softmax(logits))<\/code>; \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, <code>softmax<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c<\/li>\n<li><code>softmax<\/code> \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 <code>\u043b\u043e\u0433\u0438\u0442\u043e\u0432<\/code> \u043a <code>\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c<\/code>, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 <code>softmax<\/code>, \u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a <code>\u043b\u043e\u0433\u0438\u0442\u0430\u043c<\/code> \u043e\u0442 <code>\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c <code>\u043b\u043e\u0433\u0438\u0442\u044b<\/code><\/li>\n<li>\u0427\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043d\u043e\u0439 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/jaykmody.com\/blog\/stable-softmax\/#cross-entropy-and-log-softmax\" rel=\"nofollow noopener noreferrer\"><code>log(softmax(logits))<\/code> \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u043d\u0435\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>log_softmax(logits)<\/code><\/a>)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  \u042d\u0442\u0430\u043f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439 \u0438\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <strong>\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong>. \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0433\u043e\u043b\u043e\u0432\u0430\u00bb? \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f GPT \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 <strong>\u0433\u043e\u043b\u043e\u0432\u0443 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0434 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u043e\u0432, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lernaean_Hydra\" rel=\"nofollow noopener noreferrer\">\u0433\u0438\u0434\u0440\u0443<\/a>.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u043a\u0430\u043a \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u0443\u0431\u0438\u043c\u0441\u044f \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430.<\/p>\n<h3>\u0411\u043b\u043e\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430<\/h3>\n<p>  \u0411\u043b\u043e\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0441\u043b\u043e\u0451\u0432:<\/p>\n<ol>\n<li>Multi-head causal self attention<\/li>\n<li>Position-wise feed forward neural network<\/li>\n<\/ol>\n<pre><code class=\"python\">def transformer_block(x, mlp, attn, ln_1, ln_2, n_head):  # [n_seq, n_embd] -> [n_seq, n_embd]     # multi-head causal self attention     x = x + mha(layer_norm(x, **ln_1), **attn, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]      # position-wise feed forward network     x = x + ffn(layer_norm(x, **ln_2), **mlp)  # [n_seq, n_embd] -> [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u0441\u043b\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0432\u0432\u043e\u0434\u043e\u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0432\u043e\u0434 \u043f\u043e\u0434\u0441\u043b\u043e\u044f \u043a \u0432\u044b\u0432\u043e\u0434\u0443 \u043f\u043e\u0434\u0441\u043b\u043e\u044f).<\/p>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li><strong>Multi-head causal self attention<\/strong> \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0432\u0432\u043e\u0434\u0430\u043c\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0433\u0434\u0435 \u0432 \u0441\u0435\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0432\u043e\u0434\u0430\u043c \u00ab\u0432\u0438\u0434\u0435\u0442\u044c\u00bb \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438, position-wise feed forward network, \u043d\u043e\u0440\u043c\u044b \u0441\u043b\u043e\u0451\u0432 \u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u043a\u0430\u0431\u0443\u043b\u044f\u0440\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0432\u043e\u0434\u044b \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0417\u0430\u0434\u0430\u0447\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0432\u043e\u0434\u0430\u043c\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e.<\/li>\n<li><strong>Position-wise feed forward neural network<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0443\u0445\u0441\u043b\u043e\u0439\u043d\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u041e\u043d\u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435.<\/li>\n<li>\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0435 \u043d\u043e\u0440\u043c\u0430 \u0441\u043b\u043e\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0432\u043e\u0434 <code>layer_norm(x + sublayer(x))<\/code>, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0443 \u0441\u043b\u043e\u044f \u0432\u043e \u0432\u0432\u043e\u0434 <code>x + sublayer(layer_norm(x))<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c GPT-2. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>\u043a\u0432\u0430\u0437\u0438\u043d\u043e\u0440\u043c\u043e\u0439<\/strong>; \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 <a href=\"https:\/\/arxiv.org\/pdf\/2002.04745.pdf\" rel=\"nofollow noopener noreferrer\">\u0432\u0430\u0436\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430<\/a>.<\/li>\n<li><strong>\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u0438<\/strong> (\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 <a href=\"https:\/\/arxiv.org\/pdf\/1512.03385.pdf\" rel=\"nofollow noopener noreferrer\">ResNet<\/a>) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447:\n<ol>\n<li>\u0423\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0445 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0439, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0451\u0432). \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u00ab\u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0443\u0442\u0438\u00bb \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e \u0441\u0435\u0442\u0438, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0451\u0432 \u0441\u0435\u0442\u0438.<\/li>\n<li>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0451\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0438\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a (\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430\u043c \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u044e \u0433\u043b\u0443\u0431\u043e\u043a\u0443\u044e \u0441\u0435\u0442\u044c \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438). \u041f\u043e\u0445\u043e\u0436\u0435, \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439.<\/li>\n<li>\u041f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/programmathically.com\/understanding-the-exploding-and-vanishing-gradients-problem\/\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438\u0441\u0447\u0435\u0437\u0430\u044e\u0449\u0438\u0445\/\u0432\u0437\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432<\/a>.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0447\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u043e\u0434\u0441\u043b\u043e\u044f.<\/p>\n<h3>Position-wise Feed Forward Network<\/h3>\n<p>  \u042d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0435\u0440\u0446\u0435\u043f\u0442\u0440\u043e\u043d \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u043b\u043e\u044f\u043c\u0438:<\/p>\n<pre><code class=\"python\">def ffn(x, c_fc, c_proj):  # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u0432\u0435\u0440\u0445     a = gelu(linear(x, **c_fc))  # [n_seq, n_embd] -> [n_seq, 4*n_embd]      # \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u043d\u0438\u0437     x = linear(a, **c_proj)  # [n_seq, 4*n_embd] -> [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <code>n_embd<\/code> \u0432 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c <code>4*n_embd<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 <code>n_embd<\/code>. [\u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 GPT \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u043a\u0440\u044b\u0442\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043e\u0442 <code>4*n_embd<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 GPT. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0443\u0434\u0435\u043b\u044f\u0435\u043c multi-head attention layer \u043c\u043d\u043e\u0433\u043e <em>\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f<\/em>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b \u0443\u0441\u043f\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 GPT-3 <a href=\"https:\/\/twitter.com\/stephenroller\/status\/1579993017234382849\" rel=\"nofollow noopener noreferrer\">80% \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 feed forward layer<\/a>. \u041e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0440\u0430\u0437\u043c\u044b\u0441\u043b\u0438\u0442\u044c.]<\/p>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>params<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>mlp<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">\"mlp\": {     \"c_fc\": {\"b\": [4*n_embd], \"w\": [n_embd, 4*n_embd]},     \"c_proj\": {\"b\": [n_embd], \"w\": [4*n_embd, n_embd]}, }<\/code><\/pre>\n<p>  <\/p>\n<h3>Multi-Head Causal Self Attention<\/h3>\n<p>  \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e\u0442 \u0441\u043b\u043e\u0439 \u0432 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u00abMulti-Head Causal Self Attention\u00bb, \u0440\u0430\u0437\u0431\u0438\u0432 \u0435\u0433\u043e \u043d\u0430 \u0441\u043b\u043e\u0432\u0430 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0441\u0432\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b:<\/p>\n<ol>\n<li>Attention<\/li>\n<li>Self<\/li>\n<li>Causal<\/li>\n<li>Multi-Head<\/li>\n<\/ol>\n<p>  <\/p>\n<h4>Attention (\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435)<\/h4>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 <a href=\"https:\/\/jaykmody.com\/blog\/attention-intuition\/\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0441\u0442<\/a> \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435, \u0433\u0434\u0435 \u043c\u044b \u0441 \u043d\u0443\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0432 <a href=\"https:\/\/arxiv.org\/pdf\/1706.03762.pdf\" rel=\"nofollow noopener noreferrer\">\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0435<\/a>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/97b\/306\/2a897b3066762d1003a010703ddae3ba.svg\" alt=\"$\\text{attention}(Q, K, V) = \\text{softmax}(\\frac{QK^T}{\\sqrt{d_k}})V$\" data-tex=\"display\"\/><\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 attention (\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435). \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c <a href=\"https:\/\/lilianweng.github.io\/posts\/2018-06-24-attention\/\" rel=\"nofollow noopener noreferrer\">Attention? Attention!<\/a> \u041b\u0438\u043b\u0438\u0430\u043d \u0412\u0435\u043d\u0433 \u0438 <a href=\"https:\/\/jalammar.github.io\/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention\/\" rel=\"nofollow noopener noreferrer\">The Illustrated Transformer<\/a> \u0414\u0436\u0435\u044f \u0410\u043b\u0430\u043c\u043c\u0430\u0440\u0430, \u0433\u0434\u0435 \u0442\u043e\u0436\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<p>  \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430:<\/p>\n<pre><code class=\"python\">def attention(q, k, v):  # [n_q, d_k], [n_k, d_k], [n_k, d_v] -> [n_q, d_v]     return softmax(q @ k.T \/ np.sqrt(q.shape[-1])) @ v<\/code><\/pre>\n<p>  <\/p>\n<h4>Self<\/h4>\n<p>  \u0415\u0441\u043b\u0438 <code>q<\/code>, <code>k<\/code> \u0438 <code>v<\/code> \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <a href=\"https:\/\/lilianweng.github.io\/posts\/2018-06-24-attention\/#self-attention\" rel=\"nofollow noopener noreferrer\">self-attention<\/a> (\u00ab\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u0441\u0435\u0431\u0435\u00bb) (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u044f\u0432\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u0441\u0430\u043c\u043e\u0439 \u0441\u0435\u0431\u0435):<\/p>\n<pre><code class=\"python\">def self_attention(x): # [n_seq, n_embd] -> [n_seq, n_embd]     return attention(q=x, k=x, v=x)<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0432\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a <code>\"Jay went to the store, he bought 10 apples.\"<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0443 \u00abhe\u00bb \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u00abJay\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u00abhe\u00bb \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u00abJay\u00bb.<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0438\u043b\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u0441\u0435\u0431\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f <code>q<\/code>, <code>k<\/code>, <code>v<\/code> \u0438 \u0432\u044b\u0432\u043e\u0434 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">def self_attention(x, w_k, w_q, w_v, w_proj): # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 qkv     q = x @ w_k # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]     k = x @ w_q # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]     v = x @ w_v # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u0441\u0435\u0431\u0435 (self attention)     x = attention(q, k, v) # [n_seq, n_embd] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430     x = x @ w_proj # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e <code>q<\/code>, <code>k<\/code> \u0438 <code>v<\/code>, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0432\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0439 \u043c\u0430\u0442\u0440\u0438\u0446 \u0441 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0432\u0441\u0435\u0433\u043e \u0434\u043e \u0434\u0432\u0443\u0445, \u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c <code>w_q<\/code>, <code>w_k<\/code> \u0438 <code>w_v<\/code> \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <code>w_fc<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"python\">def self_attention(x, w_fc, w_proj): # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 qkv     x = x @ w_fc # [n_seq, n_embd] @ [n_embd, 3*n_embd] -> [n_seq, 3*n_embd]      # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 qkv     q, k, v = qkv = np.split(x, 3, axis=-1) # [n_seq, 3*n_embd] -> 3 of [n_seq, n_embd]      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c self attention     x = attention(q, k, v) # [n_seq, n_embd] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430     x = x @ w_proj # [n_seq, n_embd] @ [n_embd, n_embd] = [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0438 (GPU) \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0447\u0435\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0451\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 GPT-2, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>linear<\/code> \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u044e <code>params<\/code>:<\/p>\n<pre><code class=\"python\">def self_attention(x, c_attn, c_proj): # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 qkv     x = linear(x, **c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd]      # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 qkv     q, k, v = qkv = np.split(x, 3, axis=-1) # [n_seq, 3*n_embd] -> 3 of [n_seq, n_embd]      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c self attention     x = attention(q, k, v) # [n_seq, n_embd] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430     x = linear(x, **c_proj) # [n_seq, n_embd] @ [n_embd, n_embd] = [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f <code>params<\/code>, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>attn<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">\"attn\": {     \"c_attn\": {\"b\": [3*n_embd], \"w\": [n_embd, 3*n_embd]},     \"c_proj\": {\"b\": [n_embd], \"w\": [n_embd, n_embd]}, },<\/code><\/pre>\n<p>  <\/p>\n<h4>Causal<\/h4>\n<p>  \u0423 \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u044b \u0441 self-attention \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043d\u0430\u0448\u0438 \u0432\u0432\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0435\u0435! \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0432\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 <code>[\"not\", \"all\", \"heroes\", \"wear\", \"capes\"]<\/code>, \u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430 self attention \u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u00abwear\u00bb \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u00abcapes\u00bb. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u00abwear\u00bb \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 \u044d\u0442\u043e \u00abcapes\u00bb. \u0418 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u0432\u0435\u0434\u044c \u043d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b87\/c43\/419\/b87c4341953d9930499c99cfd4f7de89.svg\" alt=\"$i$\" data-tex=\"inline\"\/> \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u0437 \u0432\u0432\u043e\u0434\u0430 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/af7\/e3a\/1f9\/af7e3a1f988b8e55141ca4d5a30cf447.svg\" alt=\"$i+1$\" data-tex=\"inline\"\/>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b <em>\u0441\u043a\u0440\u044b\u0442\u044c<\/em> \u0438\u043b\u0438 <strong>\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/strong> \u0432\u0432\u043e\u0434\u044b, \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0432 \u0438\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0443\u0441\u0442\u044c \u043d\u0430\u0448\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\">       not    all    heroes wear   capes    not 0.116  0.159  0.055  0.226  0.443    all 0.180  0.397  0.142  0.106  0.175 heroes 0.156  0.453  0.028  0.129  0.234   wear 0.499  0.055  0.133  0.017  0.295  capes 0.089  0.290  0.240  0.228  0.153<\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u0430 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u2014 \u043a\u043b\u044e\u0447\u0443. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u00abwear\u00bb, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u00abcapes\u00bb \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0441 \u0432\u0435\u0441\u043e\u043c 0.295. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>0.0<\/code>:<\/p>\n<pre><code class=\"plaintext\">      not    all    heroes wear   capes    not 0.116  0.159  0.055  0.226  0.443    all 0.180  0.397  0.142  0.106  0.175 heroes 0.156  0.453  0.028  0.129  0.234   wear 0.499  0.055  0.133  0.017  0.  capes 0.089  0.290  0.240  0.228  0.153<\/code><\/pre>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u043e \u0432\u0432\u043e\u0434\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/15d\/8f3\/75d\/15d8f375da90503b20e8cdc70bb08879.svg\" alt=\"$i, j$\" data-tex=\"inline\"\/> (\u0433\u0434\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d88\/7b6\/b4a\/d887b6b4a733f5be3ed67681fe280b3a.svg\" alt=\"$j > i$&#187; data-tex=&#187;inline&#187;\/>) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>0<\/code>:<\/p>\n<pre><code class=\"plaintext\">       not    all    heroes wear   capes    not 0.116  0.     0.     0.     0.    all 0.180  0.397  0.     0.     0. heroes 0.156  0.453  0.028  0.     0.   wear 0.499  0.055  0.133  0.017  0.  capes 0.089  0.290  0.240  0.228  0.153<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/strong>. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0441\u0442\u0440\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0430\u0432\u043d\u0430 1 (\u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0438\u0445 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>softmax<\/code>). \u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043d\u043e\u0432\u0430 \u0432 \u0441\u0443\u043c\u043c\u0435 \u0434\u0430\u0432\u0430\u043b\u0438 1, \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>softmax<\/code>.<\/p>\n<p>  \u042d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e14\/250\/606\/e142506069924ab8e43f137e4f74835f.svg\" alt=\"$-\\infty$\" data-tex=\"inline\"\/> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c <code>softmax<\/code>. [\u0415\u0441\u043b\u0438 \u0432\u044b \u0432 \u044d\u0442\u043e\u043c \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0442\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u0441\u044c \u043a \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e softmax, \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0440\u0443\u0447\u043a\u0430 \u0441 \u0431\u0443\u043c\u0430\u0433\u043e\u0439):<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd5\/6cf\/abc\/bd56cfabcb6760236b760a21a2d7f685.svg\" alt=\"$\\text{softmax}(\\vec{x})_i=\\frac{e^{x_i}}{\\sum_je^{x_j}}$\" data-tex=\"display\"\/><\/p>\n<p>]<\/p>\n<pre><code class=\"python\">def attention(q, k, v, mask):  # [n_q, d_k], [n_k, d_k], [n_k, d_v], [n_q, n_k] -> [n_q, d_v]     return softmax(q @ k.T \/ np.sqrt(q.shape[-1]) + mask) @ v<\/code><\/pre>\n<p>  \u0433\u0434\u0435 <code>mask<\/code> \u2014 \u044d\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (\u0434\u043b\u044f <code>n_seq=5<\/code>):<\/p>\n<pre><code class=\"plaintext\">0 -1e10 -1e10 -1e10 -1e10 0   0   -1e10 -1e10 -1e10 0   0     0   -1e10 -1e10 0   0     0     0   -1e10 0   0     0     0     0<\/code><\/pre>\n<p>  \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>-1e10<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>-np.inf<\/code> \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>-np.inf<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>nan<\/code>.<\/p>\n<p>  \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <code>mask<\/code> \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>-1e10<\/code> \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043b\u044e\u0431\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043b\u044e\u0441 <code>-inf<\/code> \u0442\u043e\u0436\u0435 \u0440\u0430\u0432\u043d\u043e <code>-inf<\/code>.<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <code>mask<\/code> \u0432 NumPy \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>(1 - np.tri(n_seq)) * -1e10<\/code>.<\/p>\n<p>  \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code class=\"python\">def attention(q, k, v, mask):  # [n_q, d_k], [n_k, d_k], [n_k, d_v], [n_q, n_k] -> [n_q, d_v]     return softmax(q @ k.T \/ np.sqrt(q.shape[-1]) + mask) @ v  def causal_self_attention(x, c_attn, c_proj): # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 qkv     x = linear(x, **c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd]      # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 qkv     q, k, v = qkv = np.split(x, 3, axis=-1) # [n_seq, 3*n_embd] -> 3 of [n_seq, n_embd]      # \u043c\u0430\u0441\u043a\u0430 \u043a\u0430\u0443\u0437\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0432\u043e\u0434\u043e\u0432 \u043e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f     causal_mask = (1 - np.tri(x.shape[0])) * -1e10  # [n_seq, n_seq]      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c causal self attention     x = attention(q, k, v, causal_mask) # [n_seq, n_embd] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430     x = linear(x, **c_proj) # [n_seq, n_embd] @ [n_embd, n_embd] = [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  <\/p>\n<h4>Multi-Head<\/h4>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f <code>n_head<\/code>, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043b\u044e\u0447\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <strong>\u0433\u043e\u043b\u043e\u0432\u044b<\/strong>:<\/p>\n<pre><code class=\"python\">def mha(x, c_attn, c_proj, n_head):  # [n_seq, n_embd] -> [n_seq, n_embd]     # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f qkv     x = linear(x, **c_attn)  # [n_seq, n_embd] -> [n_seq, 3*n_embd]      # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 qkv     qkv = np.split(x, 3, axis=-1)  # [n_seq, 3*n_embd] -> [3, n_seq, n_embd]      # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u044b     qkv_heads = list(map(lambda x: np.split(x, n_head, axis=-1), qkv))  # [3, n_seq, n_embd] -> [3, n_head, n_seq, n_embd\/n_head]      # \u043c\u0430\u0441\u043a\u0430 \u043a\u0430\u0443\u0437\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0432\u043e\u0434\u043e\u0432 \u043e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f     causal_mask = (1 - np.tri(x.shape[0])) * -1e10  # [n_seq, n_seq]      # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b     out_heads = [attention(q, k, v, causal_mask) for q, k, v in zip(*qkv_heads)]  # [3, n_head, n_seq, n_embd\/n_head] -> [n_head, n_seq, n_embd\/n_head]      # \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u044b     x = np.hstack(out_heads)  # [n_head, n_seq, n_embd\/n_head] -> [n_seq, n_embd]      # \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430     x = linear(x, **c_proj)  # [n_seq, n_embd] -> [n_seq, n_embd]      return x<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>q, k, v<\/code> \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u044b <code>n_head<\/code>:<br \/> \n<pre><code class=\"python\"># \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u044b qkv_heads = list(map(lambda x: np.split(x, n_head, axis=-1), qkv))  # [3, n_seq, n_embd] -> [n_head, 3, n_seq, n_embd\/n_head]<\/code><\/pre>\n<\/li>\n<li>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b:\n<pre><code class=\"python\"># \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b out_heads = [attention(q, k, v) for q, k, v in zip(*qkv_heads)]  # [n_head, 3, n_seq, n_embd\/n_head] -> [n_head, n_seq, n_embd\/n_head]<\/code><\/pre>\n<\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b:\n<pre><code class=\"python\"># \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u044b x = np.hstack(out_heads)  # [n_head, n_seq, n_embd\/n_head] -> [n_seq, n_embd]<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0441 <code>n_embd<\/code> \u0434\u043e <code>n_embd\/n_head<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441. \u0412 \u043e\u0431\u043c\u0435\u043d \u043d\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <em>\u043f\u043e\u0434\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430<\/em> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0441\u0442\u043e\u0438\u043c\u0435\u043d\u0438\u0439 \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e\u0438\u043c\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430\u043c. \u0422\u0440\u0435\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u0441\u043b\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u00ab\u0447\u0451\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a\u00bb \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 (\u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430 \u0440\u0430\u0437) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432, \u0447\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>  \u0418 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e GPT! \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434.<\/p>\n<h2>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435<\/h2>\n<p>  \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <a href=\"https:\/\/github.com\/jaymody\/picoGPT\/blob\/main\/gpt2.py\" rel=\"nofollow noopener noreferrer\">gpt2.py<\/a>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u0437 120 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 (<a href=\"https:\/\/github.com\/jaymody\/picoGPT\/blob\/a750c145ba4d09d5764806a6c78c71ffaff88e64\/gpt2_pico.py#L3-L58\" rel=\"nofollow noopener noreferrer\">60 \u0441\u0442\u0440\u043e\u043a, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b<\/a>).<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">python gpt2.py \\     \"Alan Turing theorized that computers would one day become\" \\     --n_tokens_to_generate 8<\/code><\/pre>\n<p>  \u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<pre><code class=\"plaintext\">the most powerful machines on the planet.<\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u0451\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u0441 <a href=\"https:\/\/github.com\/openai\/gpt-2\" rel=\"nofollow noopener noreferrer\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c GPT-2 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 OpenAI<\/a> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c <a href=\"https:\/\/gist.github.com\/jaymody\/9054ca64eeea7fad1b58a185696bb518\" rel=\"nofollow noopener noreferrer\">Dockerfile<\/a>. (\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 tensorflow \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Macbook \u0441 M1; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043a\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 GPT-2, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0451\u043c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u043c):<\/p>\n<pre><code class=\"plaintext\">docker build -t \"openai-gpt-2\" \"https:\/\/gist.githubusercontent.com\/jaymody\/9054ca64eeea7fad1b58a185696bb518\/raw\/Dockerfile\" docker run -dt \"openai-gpt-2\" --name \"openai-gpt-2-app\" docker exec -it \"openai-gpt-2-app\" \/bin\/bash -c 'python3 src\/interactive_conditional_samples.py --length 8 --model_type 124M --top_k 1' # paste \"Alan Turing theorized that computers would one day become\" when prompted<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"plaintext\">the most powerful machines on the planet.<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h2>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u0432 \u043d\u0435\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0443\u0447\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<h3>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GPU\/TPU<\/h3>\n<p>  \u0417\u0430\u043c\u0435\u043d\u0438\u043c NumPy \u043d\u0430 <a href=\"https:\/\/github.com\/google\/jax\" rel=\"nofollow noopener noreferrer\">JAX<\/a>:<\/p>\n<pre><code class=\"python\">import jax.numpy as np<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0441 GPU \u0438 \u0434\u0430\u0436\u0435 \u0441 <a href=\"https:\/\/cloud.google.com\/tpu\/docs\/system-architecture-tpu-vm\" rel=\"nofollow noopener noreferrer\">TPU<\/a>!<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 (Backpropagation)<\/h3>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u043c NumPy \u043d\u0430 <a href=\"https:\/\/github.com\/google\/jax\" rel=\"nofollow noopener noreferrer\">JAX<\/a>:<\/p>\n<pre><code class=\"python\">import jax.numpy as np<\/code><\/pre>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e:<\/p>\n<pre><code class=\"python\">def lm_loss(params, inputs, n_head) -> float:     x, y = inputs[:-1], inputs[1:]     output = gpt2(x, **params, n_head=n_head)     loss = np.mean(-np.log(output[y]))     return loss  grads = jax.grad(lm_loss)(params, inputs, n_head)<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0411\u0430\u0442\u0447\u0438\u043d\u0433<\/h3>\n<p>  \u041c\u044b \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c NumPy \u043d\u0430 <a href=\"https:\/\/github.com\/google\/jax\" rel=\"nofollow noopener noreferrer\">JAX<\/a>:<\/p>\n<pre><code class=\"python\">import jax.numpy as np<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>gpt2<\/code> \u0431\u0430\u0442\u0447\u0438\u043d\u0433, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e:<\/p>\n<pre><code class=\"python\">gpt2_batched = jax.vmap(gpt2, in_axes=[0, None, None, None, None, None]) gpt2_batched(batched_inputs) # [batch, seq_len] -> [batch, seq_len, vocab]<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Inference<\/h3>\n<p>  \u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f. \u0421\u0430\u043c\u043e\u0435 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c GPU + \u0431\u0430\u0442\u0447\u0438\u043d\u0433) \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a href=\"https:\/\/kipp.ly\/blog\/transformer-inference-arithmetic\/#kv-cache\" rel=\"nofollow noopener noreferrer\">\u043a\u044d\u0448\u0430 kv<\/a>, \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0432 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. [\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 JAX \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>heads = jax.vmap(attention, in_axes=(0, 0, 0, None))(q, k, v, causal_mask)<\/code>.]<\/p>\n<p>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 inference. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e <a href=\"https:\/\/lilianweng.github.io\/posts\/2023-01-10-inference-optimization\/\" rel=\"nofollow noopener noreferrer\">Large Transformer Model Inference Optimization<\/a> \u041b\u0438\u043b\u0438\u0430\u043d \u0412\u0435\u043d\u0433 \u0438 <a href=\"https:\/\/kipp.ly\/blog\/transformer-inference-arithmetic\/\" rel=\"nofollow noopener noreferrer\">Transformer Inference Arithmetic<\/a> Kipply.<\/p>\n<h3>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431\u044a\u0451\u043c\u043e\u0432, \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 GPT \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0435\u0439 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 Adam, \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\/\u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0432\u0435\u0441\u043e\u0432, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0435\u0441\u043e\u0432, \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435&#8230;), \u043d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0432\u0435\u0449\u0438.<\/p>\n<p>  \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u043d\u0433\u0440\u0435\u0434\u0438\u0435\u043d\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 GPT \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <strong>\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u043e\u0434\u0435\u043b\u0438<\/strong>.<\/p>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043e\u0440\u043f\u0443\u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432.<\/p>\n<ul>\n<li>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u2014 \u044d\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0446\u0435\u043d\u0438\u0442\u0435 <a href=\"https:\/\/pile.eleuther.ai\" rel=\"nofollow noopener noreferrer\">The Pile<\/a> \u2014 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/li>\n<li>\u041f\u043e\u0434 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043d\u0435\u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0431\u0435\u0441\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435<\/li>\n<li>\u041f\u043e\u0434 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u043c, \u0442\u0435\u043a\u0441\u0442\u044b \u0438\u0437 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u044b, \u0442\u043e \u044d\u0442\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u044d\u0442\u0438\u043c \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c\u0438.<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u0443\u0447\u0430 \u0442\u0440\u0443\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 (\u0438 \u0434\u0435\u043d\u0435\u0433). \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/github.com\/NVIDIA\/Megatron-LM\" rel=\"nofollow noopener noreferrer\">\u0430\u0431\u0441\u0443\u0440\u0434\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u043c\u0438 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438<\/a>. \u041d\u0430\u0447\u0430\u0442\u044c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 <a href=\"https:\/\/lilianweng.github.io\/posts\/2021-09-25-train-large\/\" rel=\"nofollow noopener noreferrer\">How to Train Really Large Models on Many GPUs<\/a> \u041b\u0438\u043b\u0438\u0430\u043d \u0412\u0435\u043d\u0433. \u041f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/arxiv.org\/pdf\/1909.08053.pdf\" rel=\"nofollow noopener noreferrer\">Megatron Framework<\/a> \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 NVIDIA, <a href=\"https:\/\/arxiv.org\/pdf\/2204.06514.pdf\" rel=\"nofollow noopener noreferrer\">Training Framework<\/a> \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Cohere, <a href=\"https:\/\/arxiv.org\/pdf\/2204.02311.pdf\" rel=\"nofollow noopener noreferrer\">PALM<\/a> \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Google, \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/kingoflolz\/mesh-transformer-jax\" rel=\"nofollow noopener noreferrer\">mesh-transformer-jax<\/a> (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 EleutherAI) \u0438 <a href=\"https:\/\/arxiv.org\/pdf\/2203.15556.pdf\" rel=\"nofollow noopener noreferrer\">\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/a> <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/blog\/turing-nlg-a-17-billion-parameter-language-model-by-microsoft\/\" rel=\"nofollow noopener noreferrer\">\u0434\u0440\u0443\u0433\u0438\u0445<\/a> <a href=\"https:\/\/arxiv.org\/pdf\/2005.14165.pdf\" rel=\"nofollow noopener noreferrer\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/a>.<\/p>\n<h3>\u041e\u0446\u0435\u043d\u043a\u0430<\/h3>\n<p>  \u041a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c LLM? \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 <a href=\"https:\/\/arxiv.org\/abs\/2211.09110\" rel=\"nofollow noopener noreferrer\">HELM<\/a>, \u043d\u043e \u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Goodhart%27s_law\" rel=\"nofollow noopener noreferrer\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c \u043e\u0446\u0435\u043d\u043e\u043a<\/a> \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0441\u043a\u0435\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<h3>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/h3>\n<p>  \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0437\u0443\u0447\u0438\u0442\u044c <a href=\"https:\/\/github.com\/lucidrains\/x-transformers\" rel=\"nofollow noopener noreferrer\">X-Transformers<\/a> \u0424\u0438\u043b\u0430 \u0412\u0430\u043d\u0430. \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/arxiv.org\/pdf\/2102.11972.pdf\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/717644\/\"> https:\/\/habr.com\/ru\/post\/717644\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/post\/716902\/\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0447\u0430\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439<\/a><\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT<\/h2>\n<p>  \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 <a href=\"https:\/\/arxiv.org\/pdf\/1706.03762.pdf\" rel=\"nofollow noopener noreferrer\">\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430<\/a>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/d1f\/eaa\/c78\/d1feaac787934e731622a62f8c6dbf48.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d1f\/eaa\/c78\/d1feaac787934e731622a62f8c6dbf48.png\"\/><\/div>\n<p>  <i>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 \u0438\u0437 Attention is All You Need<\/i><\/p>\n<p>  \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 (\u043f\u0440\u0430\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/d01\/57c\/6ed\/d0157c6ed3d9f64e48888da5ef165098.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d01\/57c\/6ed\/d0157c6ed3d9f64e48888da5ef165098.png\"\/><\/div>\n<p>  <i>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPT<\/i><\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043b\u043e\u0439 \u00ab\u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f\u00bb \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u043e\u0436\u0435 \u0443\u0431\u0440\u0430\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-345747","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=345747"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345747\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=345747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=345747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=345747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}