<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>나와 아날로그와 흰 당나귀</title>
    <link>https://graydonkey.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 05:02:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>잿빛나귀</managingEditor>
    <image>
      <title>나와 아날로그와 흰 당나귀</title>
      <url>https://tistory1.daumcdn.net/tistory/3891049/attach/2213e9744629450d88adc3ce13b08486</url>
      <link>https://graydonkey.tistory.com</link>
    </image>
    <item>
      <title>PseudoCon 2025 회고록</title>
      <link>https://graydonkey.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 지금으로부터 2주 전인 5월 17일, 나는 PseudoCon 행사 참여를 위해 서울로 올라갔다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;정말 행운스럽게도, 이 행사에 참여하게 된 것은 여러 우연들이 겹쳐서 생긴 뜻밖의 일이었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오늘은 이 기적같은 일들을 공유하고 싶어 글을 쓰게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; data-alt=&quot;가짜연구소 대표이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmlbud%2FbtsOiIXn13X%2F3W6RsfKZdbOpatWE9ExPqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;297&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가짜연구소 대표이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지난 3개월 간, 나는 가짜연구소 인과추론팀의 Lang2SQL 스터디에 청강으로 참여하게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그동안의 기간은 내가 경험했던 어느 3개월보다도 강렬했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 가치관을 완전히 바꿀만한 경험을 이 프로젝트를 통해, 이 행사를 통해 맛보게 되었기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Lang2SQL 프로젝트에 참여했던 기억&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;돌이켜보면 나의 기적은 Lang2SQL 프로젝트의 청강을 시도하면서부터 시작되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;매주 디스코드 채널에서 현업의 최전선에서 치열하게 일하시는 분들을 마주하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그분들과 아이디어를 주고받으며 배우는 과정은 마치 거인의 어깨에 올라 더 넓은 세상을 바라보는 듯한 경험이었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbOk1i/btsOh5T2oy4/iqh6o7DfTMd2rbV6YXJxSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbOk1i/btsOh5T2oy4/iqh6o7DfTMd2rbV6YXJxSk/img.png&quot; data-alt=&quot;PseudoCon 포스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbOk1i/btsOh5T2oy4/iqh6o7DfTMd2rbV6YXJxSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbOk1i%2FbtsOh5T2oy4%2Fiqh6o7DfTMd2rbV6YXJxSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;392&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PseudoCon 포스터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가짜연구소 팀과의 만남&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;행사장에 30분 가량 일찍 도착했는데, 내 얼굴과 이름을 알고 계시는 분이 생각보다 정말 많았고, 또 좋게 봐주셔서 너무 놀랐다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개인적으로 마음속으로 존경하는 가짜연구소 총대장님과 인과추론 대장님이 내 이름을 알고 계셔서 굉장히 기뻤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PseudoCon : 발표 세션&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PseudoCon은 인과추론팀 대장님의 키노트 발표로부터 시작되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 그 분을 인과추론팀 밋업 행사 때 처음 뵀었는데, 남다른 열정은 지금도 잊히지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 열정에 많은 사람들이 이끌리고, 또 가치를 직접 실현함으로써 AI 씬을 움직이는 동력이 되는 것이라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 언젠가는 그분처럼 에너지를 실천으로 옮겨, 가치를 직접 만들어나가는 사람이 되고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 발표에서는 가짜연구소에서 하나씩 쌓아 올린 작은 성과들이 &amp;lsquo;점&amp;rsquo;이 되고, 그 점들이 열정적인 분들과 연결되며 &amp;lsquo;선&amp;rsquo;이 되어 하나의 스토리가 되는 과정을 간결하게 보여주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 여정도 이와 비슷하게 하나하나의 활동이 모여 거대한 흐름을 만들어가는 것 같아 신기했고, 그렇기에 더욱 깊이 공감할 수 있었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qtLlB/btsOiIEEXAS/AYgh1Ubpuf492UXH2m3EHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qtLlB/btsOiIEEXAS/AYgh1Ubpuf492UXH2m3EHk/img.png&quot; data-alt=&quot;발표 세션 진행 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qtLlB/btsOiIEEXAS/AYgh1Ubpuf492UXH2m3EHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqtLlB%2FbtsOiIEEXAS%2FAYgh1Ubpuf492UXH2m3EHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;286&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발표 세션 진행 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;가장 기억에 남았던 발표 세션은&lt;b&gt; AI/ML&lt;/b&gt; 취업 전략 이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 취업에 관심이 많아 발표에 더 집중할 수밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 창업을 준비하고 있지만, 언젠가 엔지니어로서 성장하고 싶었기에 앞선 분들의 경험을 온몸으로 체험해보고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연사자님의 발표를 듣고 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333; text-align: start;&quot;&gt;개인적으로 정말 대단했다고 느꼈던 점은 성장하기 위해 투자를 아끼지 않았다는 점이었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 사례를 열거하기는 힘들지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;178&quot; data-start=&quot;78&quot; data-ke-size=&quot;size16&quot;&gt;원하는 연구실에 들어가기 위해 사비로 미국 학회까지 다녀온 점부터,&lt;br /&gt;지망 연구실 논문을 모조리 리뷰하고 그 과정을 유튜브에 올린 점,&lt;br /&gt;교수님께 끊임없이 연락을 드린 점,&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;250&quot; data-start=&quot;180&quot; data-ke-size=&quot;size16&quot;&gt;중단된&amp;nbsp;연구를&amp;nbsp;이어가기&amp;nbsp;위해&amp;nbsp;비슷한&amp;nbsp;아키텍처의&amp;nbsp;하드웨어를&amp;nbsp;직접&amp;nbsp;구해&amp;nbsp;구현하신&amp;nbsp;부분까지&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런&amp;nbsp;열정과&amp;nbsp;노력을&amp;nbsp;보며,&amp;nbsp;나도&amp;nbsp;꿈을&amp;nbsp;이루기&amp;nbsp;위해&amp;nbsp;끊임없이&amp;nbsp;노력해야겠다고&amp;nbsp;다짐했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;141&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PseudoCon : 부스 세션&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;Lang2SQL 프로젝트를 청강으로 참여했던 덕분에 Lang2SQL 부스 세션을 도와드릴 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 많은 사람들이 우리 부스에 관심을 가지셨는데, 데모를 직접 체험하실 수 있게 세팅을 해둔 덕분인지 흥미롭게 지켜보셨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 부스를 방문해 주신 분들께 프로젝트에 대해 직접 설명해 드렸고, 시연한 결과를 보여드렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉽게도 실제 DB가 아닌 더미데이터로 구성된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;시연 DB를 사용했지만, &lt;/span&gt;자연어 입력부터 SQL 생성과정과 결과 분석까지 보여드릴 수 있어 반응이 좋았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 좋았던 점은 비슷한 문제를 겪고 있으신 분들께서 피드백을 남겨주셨던 점이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 대해 설명하면서 개발자들이 공통으로 겪고 있는 어려움을 파악하고, 또 의견을 서로 공유하면서 영양가 있는 아이디어들을 얻을 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 우리 Lang2SQL 팀원들이 공통으로 겪고 있던 생성된 쿼리가 유효한지에 대해 여쭤보셨던 분이 기억에 남는다.&amp;nbsp;&lt;br /&gt;그분께는 예전에 스터디를 진행하며 깃헙 위키에 작성했던&amp;nbsp;내용과 링크를 함께 공유해 드렸다.&lt;br /&gt;이 과정을 통해 실제 사용자 관점의 이슈를 더 깊이 이해하게 되었고, 앞으로 개선할 부분이 한층 뚜렷해진 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PseudoCon : 뜻밖의 행운&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PseudoCon 막바지에는 추첨을 진행했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추첨에 당첨될 그 행운의 주인공이 누굴까 고심하며 지켜봤는데...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맙소사.. 그 주인공이 바로 나였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNc4e/btsOljJKk9E/ntrtISf0XqaFPZxyaImbr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNc4e/btsOljJKk9E/ntrtISf0XqaFPZxyaImbr1/img.png&quot; data-alt=&quot;MSI 노트북&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNc4e/btsOljJKk9E/ntrtISf0XqaFPZxyaImbr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNc4e%2FbtsOljJKk9E%2FntrtISf0XqaFPZxyaImbr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;396&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MSI 노트북&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;o4-mini-high&quot; data-message-id=&quot;27ee1641-2369-4462-889b-8b18380451c1&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;노트북으로는 ML을 CUDA 레벨로 구현해 볼 예정이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;예전에 안드레카파시 영상을 보고 Tinygrad를 따라 만들었는데, 이 Tinygrad를 사용해서 내 노트북에 걸맞게 ML을 만들어보겠다.&amp;nbsp;&lt;br /&gt;또 프루닝이나 양자화 같은 경량화 기법도 공부해서 직접 적용해보고 싶다.&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;CUDA 레벨에서부터 ML 프로그램까지 전체적인 파이프라인이 막힘없이 잘 상호작용할 수 있게 구조를 짜고 싶은 것이 나의 바람이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스펙을 살펴보니 확장성이 정말 뛰어나서, TensorRT나 custom NPU 개발까지 다양한 실험을 해볼 수 있을 것 같다.&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;사진을 워낙 못 찍어서 그렇지, 실물은 한층 더 멋있고 웅장하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;416&quot; data-start=&quot;282&quot; data-ke-size=&quot;size16&quot;&gt;다시 한번 Lang2SQL 오픈소스 팀과 인과추론 팀, 그리고 PseudoCon 준비진 모두에게 진심으로 감사의 말씀을 전하고 싶다.&amp;nbsp;&lt;br /&gt;작은 점들이 모여 선이 되고, 또 다른 스토리를 만들어가듯, 이번 행운도 앞으로의 여정에 큰 힘이 될 것 같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>일상</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/39</guid>
      <comments>https://graydonkey.tistory.com/39#entry39comment</comments>
      <pubDate>Fri, 30 May 2025 17:26:51 +0900</pubDate>
    </item>
    <item>
      <title>Lang2SQL 프로젝트 참여 회고록</title>
      <link>https://graydonkey.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 정말 오랜만에 글을 작성하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그는 띄엄띄엄 아주 조금씩 나아가고 있는데, 요즘 나의 인생은 이제야 거친 바다를 나아가는 느낌이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항해 일지를 쓰지 않은 지난 날을 반성하며, 과거를 회상하고 또 기록에 남겨두겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말이지 많은 날이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교를 졸업하고 망망대해에 던져지고 나서부터 비로소 수평선이 보이는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기는 형용할 수 없는 위협이 도사리고 있지만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;정말 자유로운 지대이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그만큼&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마음껏 꿈을 펼칠 수 있고, 또 어디로든 갈 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 글에서는 그 여정들 중 하나인 가짜연구소에서의 활동을 소개하겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가짜연구소 활동에 참여하면서&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; data-alt=&quot;가짜연구소 대표이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mlbud/btsOiIXn13X/3W6RsfKZdbOpatWE9ExPqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmlbud%2FbtsOiIXn13X%2F3W6RsfKZdbOpatWE9ExPqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;297&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가짜연구소 대표이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이전까지의 나는 항상 따라가는 쪽에 속했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내 주변의 친구들도 그랬고, 어른들도 그런 형태로 조언을 많이 주셨던 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 가짜연구소에서 마주한 분들은 달랐다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스스로 가치를 만들어내고, AI 생태계에 기여하기 위해 자발적으로 움직이는 모습은 내게 큰 충격이었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가짜연구소 행사에서 만난 사람들은 내가 만났던 그 어떤 커뮤니티보다도 활발했고, 열정이 가득했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오롯이 '함께 성장하고, 지식을 나누며, 더 나은 생태계를 만드는 것&amp;rsquo; 하나만으로 모여 거대 기업에 좌우된다고만 믿었던 생태계를 리드하고 있었다. 스스로 배우면서 성장하는 모습은 도끼로 머리를 한대 얻어맞은 듯한 신선한 충격이었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Lang2SQL 프로젝트 참여&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가짜연구소에 참여하게 된 계기는 &lt;a href=&quot;https://github.com/DShomin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@DShomin&lt;/a&gt; 님의 권유 덕분이었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DShomin 님의 한마디에 호기심이 생겨 서둘러 검색해 본 나는, 곧바로 이들의 프로젝트에 매료되었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 그 당시에는 바로 스터디에 참여할 수 없었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가짜연구소 디스코드에 매일 들락거리며 스터디가 언제 개설되는지 전전긍긍하며 확인했고, 개인 프로젝트도 틈틈이 진행하며 준비하였다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러다 결국 바람대로 스터디가 열리게 되었고, 나는 바로 지원했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각각 Lang2SQL, Agent AI, 모델 양자화분야에 지원했고, 천천히 기다렸지만..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한껏 부푼 꿈을 안고 시작된 나의 항해는 곧바로 가짜연구소의 높은 벽에 부딪혀 박살 나버렸다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 당시 얼마나 좌절했었는지, 하루종일 아무것도 못 할 지경이었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 머리를 비집고 들어가서라도 배우고 싶었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 사람들은 어떤 아이디어를 가지고 있는지, 어떤 스타일의 코드를 작성하는지, 어떤 방식으로 사고하고 문제를 해결하는지..&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;꼭 배워서 내 것으로 만들어야 겠다는 확고한 의지가 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Lang2SQL 프로젝트에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;청강으로&lt;span&gt; 참여하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;프로젝트를 진행하면서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매주 월요일 저녁 8시, 디스코드를 통해 프로젝트 스터디를 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디원 분들은 정말 상상 이상이신 분들이 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실력으로도, 경력으로도 엄청나신 분들이라 한편으로는 두려우면서도 부족함 없이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;배울 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매주 아이디어를 나누고 PR을 머지하며 진지하게 토론하던 시간은 아직도 꿈결 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;마음가짐에 대해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나의 배울점을 끝으로 글을 마치겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 어떻게든 기여하고 싶어 내 아이디어가 유용하다는 것을 보이고 싶었지만, 그분들의 태도는 나와 사뭇 달랐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그분들은 나와 대조적으로 자신의 아이디어가 유일한 정답이 아니라는 것을 확신하기 위해 두려움 없이 PR과 의견을 공유하고, 또 피드백을 구한다는 점에서 많은 감명을 받았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 언제나 결과물이 리젝 당할 수 있다는 두려움이 존재할 수 있는 법인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업물과 아이디어를 어떻게든 병합하기 위해 설득하는 것이 아니라 진정으로 프로젝트에 올바른 방향인지 고민한다는 점이 인상적이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트를 공유하며 이 글을 마치겠다.&amp;nbsp;&lt;br /&gt;이후에는 나는 어떤 부분에서 기여를 할 수 있었는지 아이디어와 함께 정리하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/CausalInferenceLab/Lang2SQL&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/CausalInferenceLab/Lang2SQL&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748509311010&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - CausalInferenceLab/Lang2SQL&quot; data-og-description=&quot;Contribute to CausalInferenceLab/Lang2SQL development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CausalInferenceLab/Lang2SQL&quot; data-og-url=&quot;https://github.com/CausalInferenceLab/Lang2SQL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q779m/hyY1cffuyF/qLaWN7VuxCPL5WsLP0M0Kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/z7t4W/hyY09QoFBu/BZVvegiMu8Jua7mZQTfqBk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/CausalInferenceLab/Lang2SQL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CausalInferenceLab/Lang2SQL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q779m/hyY1cffuyF/qLaWN7VuxCPL5WsLP0M0Kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/z7t4W/hyY09QoFBu/BZVvegiMu8Jua7mZQTfqBk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - CausalInferenceLab/Lang2SQL&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to CausalInferenceLab/Lang2SQL development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/38</guid>
      <comments>https://graydonkey.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 29 May 2025 18:02:42 +0900</pubDate>
    </item>
    <item>
      <title>Chain of thought</title>
      <link>https://graydonkey.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 논문 : &lt;a href=&quot;https://arxiv.org/abs/2201.11903&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739951608100&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models&quot; data-og-description=&quot;We explore how generating a chain of thought -- a series of intermediate reasoning steps -- significantly improves the ability of large language models to perform complex reasoning. In particular, we show how such reasoning abilities emerge naturally in su&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2201.11903&quot; data-og-url=&quot;https://arxiv.org/abs/2201.11903v6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Jzts2/hyYjI6z4ku/TtrzqQLgPW9GYAVDqZssiK/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/bhnuy6/hyYjwrz1WZ/jRObdotCssecUMiXDw6RtK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2201.11903&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2201.11903&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Jzts2/hyYjI6z4ku/TtrzqQLgPW9GYAVDqZssiK/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/bhnuy6/hyYjwrz1WZ/jRObdotCssecUMiXDw6RtK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We explore how generating a chain of thought -- a series of intermediate reasoning steps -- significantly improves the ability of large language models to perform complex reasoning. In particular, we show how such reasoning abilities emerge naturally in su&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# Chain of Thought란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 문제를 해결하기 위해 모델이 단계별로 논리적으로 사고하도록 유도하는 기법이다. Prompt Enginering 기법 중 하나로, LLM의 &lt;b&gt;추론 능력을 향상시키기 위해 사용&lt;/b&gt;되며, &lt;b&gt;수학적 문제 해결, 논리적 사고, 복잡한 질의 응답&lt;/b&gt; 등의 성능을 크게 향상시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHbhiK%2FbtsMpAGg7Fb%2F1dwHLb8qaUOCcs2baUVfZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;275&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에서 Standard Prompting의 경우 QA 쌍만 제공했을 때는 모델이 정답을 맞히질 못했지만, Chain of Thought Prompting을 사용했을 때는 답변을 정확히 맞춘 것을 확인할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# Chain of thought의 핵심&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;287&quot; data-start=&quot;238&quot;&gt;프롬프트에 &lt;b&gt;논리적 사고 과정을 명시적으로 제공하고, 답을 도출&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;335&quot; data-start=&quot;291&quot;&gt;수학 문제 &lt;b&gt;중간 계산 과정을 쓰면서 푸는 것과 유사&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# Why Chain of Thought?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 CoT 방법을 쓰면 답변 품질이 향상될까? 그 이유는 llm이 논리적으로 사고하는데 있어 충분한 토큰이 필요하기 때문이다. llm은 auto regressive 한 방식으로 동작하기에 이전 출력 토큰들을 기반으로 순차적으로 다음 토큰을 예측하게 된다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;llm은 주어진 패턴을 흉내내는 것을 아주 잘하는데, 그렇기에 이런 CoT Prompt를 주면 모델이 더욱 깊이 있는 추론을 하게 된다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;llm이 프롬프트에 주어진 방식대로 풀이 과정을 따르면서 정확한 답변으로 도달하게 된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에 나와있는 예시를 조금 더 깊게 살펴보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HbhiK/btsMpAGg7Fb/1dwHLb8qaUOCcs2baUVfZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHbhiK%2FbtsMpAGg7Fb%2F1dwHLb8qaUOCcs2baUVfZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;275&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Standard Prompting에서는 The answer is 다음에 나올 토큰을 한번에 예측해야 하므로 모델이 충분한 추론 없이 문제에 대한 답변을 바로 한다. 이는 틀린 답변이 나올 가능성이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 CoT Prompting을 사용했을 때는 풀이 과정을 하나씩 자세하게 나열하고 풀이과정(이전 토큰)을 다음 입력으로 넣어 모델 답변의 정확도를 높인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# 어디에 CoT를 사용하는 게 적절한가?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yDZJe/btsMo8wDd4X/1U1kGd8Sp9SbHQ8aGYf4gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yDZJe/btsMo8wDd4X/1U1kGd8Sp9SbHQ8aGYf4gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yDZJe/btsMo8wDd4X/1U1kGd8Sp9SbHQ8aGYf4gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyDZJe%2FbtsMo8wDd4X%2F1U1kGd8Sp9SbHQ8aGYf4gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;521&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;1224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 위의 수학 문제 뿐만 아니라 다양한 영역에서 CoT를 적용할 수 있음을 보여주고 있다. 적절한 프롬프팅을 통해 추론을 극대화 하는 데 사용될 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# CoT의 단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT는 답변의 품질을 향상시키는 강력한 기법이지만, 모든 Task에서 효과적이지는 않다.&amp;nbsp;다음과 같은 몇 가지 단점이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Inference 속도 저하&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;CoT는 단계별로 reasoning을 수행하기 때문에, 더 많은 토큰을 생성해야 하며, 그만큼 Inference 속도가 느려질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 논리적 오류 발생 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 중간 과정 중 reasoning을 잘못하면, 잘못된 reasoning을 그대로 따라가면서 오답을 생성할 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 비효율적 해결 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델이 학습된 패턴을 기반으로 reasoning을 수행하기 때문에, 가장 최적의 해결 방법을 선택하지 않을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 장황한 답변&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 간단한 질문에도 지나치게 자세한 풀이 과정을 포함하면서, 짧고 직관적인 답변이 필요한 경우 비효율적일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 모델 크기에 따라 효과가 제한&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CoT는 특정 크기 이상의 모델(ex. gpt3.5 135B)에서 효과가 극대화되며, 작은 모델에서는 기대만큼의 성능 향상이 어려울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# Tree of Thoughts&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 CoT가 선형적으로 문제를 해결했다면, ToT는 여러 가지 사고(Thoughts)흐름을 분기하여 문제 해결 가능성을 확장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 풀기 위한 여러 아이디어를 떠올리고, 그 방법들을 검토하면서 최적의 해결법을 찾는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 자세한 내용은 추후 포스팅에서 다루겠다..&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/논문 리뷰</category>
      <category>chain_of_thought</category>
      <category>Cot</category>
      <category>TOT</category>
      <category>tree_of_thoughts</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/37</guid>
      <comments>https://graydonkey.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 19 Feb 2025 18:01:19 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 LV2 마법의 엘리베이터</title>
      <link>https://graydonkey.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653?language=python3#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;마법의 엘리베이터&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737810780817&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653?language=python3#&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eQ94m/hyX4vBkzhq/wY2kIQ2tgTDGgQK8uwCTLk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bKa0HK/hyX4ySoMnk/9lK3gPhKqDCjF9r4SyOxMK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653?language=python3#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653?language=python3#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eQ94m/hyX4vBkzhq/wY2kIQ2tgTDGgQK8uwCTLk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bKa0HK/hyX4ySoMnk/9lK3gPhKqDCjF9r4SyOxMK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 설명 &amp;amp; 제한조건&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;마법의&amp;nbsp;세계에&amp;nbsp;사는&amp;nbsp;민수는&amp;nbsp;아주&amp;nbsp;높은&amp;nbsp;탑에&amp;nbsp;살고&amp;nbsp;있습니다.&amp;nbsp;탑이&amp;nbsp;너무&amp;nbsp;높아서&amp;nbsp;걸어&amp;nbsp;다니기&amp;nbsp;힘든&amp;nbsp;민수는&amp;nbsp;마법의&amp;nbsp;엘리베이터를&amp;nbsp;만들었습니다.&amp;nbsp;마법의&amp;nbsp;엘리베이터의&amp;nbsp;버튼은&amp;nbsp;특별합니다.&amp;nbsp;마법의&amp;nbsp;엘리베이터에는&amp;nbsp;-1,&amp;nbsp;+1,&amp;nbsp;-10,&amp;nbsp;+10,&amp;nbsp;-100,&amp;nbsp;+100&amp;nbsp;등과&amp;nbsp;같이&amp;nbsp;절댓값이&amp;nbsp;10c&amp;nbsp;(c&amp;nbsp;&amp;ge;&amp;nbsp;0&amp;nbsp;인&amp;nbsp;정수)&amp;nbsp;형태인&amp;nbsp;정수들이&amp;nbsp;적힌&amp;nbsp;버튼이&amp;nbsp;있습니다.&amp;nbsp;마법의&amp;nbsp;엘리베이터의&amp;nbsp;버튼을&amp;nbsp;누르면&amp;nbsp;현재&amp;nbsp;층&amp;nbsp;수에&amp;nbsp;버튼에&amp;nbsp;적혀&amp;nbsp;있는&amp;nbsp;값을&amp;nbsp;더한&amp;nbsp;층으로&amp;nbsp;이동하게&amp;nbsp;됩니다.&amp;nbsp;단,&amp;nbsp;엘리베이터가&amp;nbsp;위치해&amp;nbsp;있는&amp;nbsp;층과&amp;nbsp;버튼의&amp;nbsp;값을&amp;nbsp;더한&amp;nbsp;결과가&amp;nbsp;0보다&amp;nbsp;작으면&amp;nbsp;엘리베이터는&amp;nbsp;움직이지&amp;nbsp;않습니다.&amp;nbsp;민수의&amp;nbsp;세계에서는&amp;nbsp;0층이&amp;nbsp;가장&amp;nbsp;아래층이며&amp;nbsp;엘리베이터는&amp;nbsp;현재&amp;nbsp;민수가&amp;nbsp;있는&amp;nbsp;층에&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;마법의&amp;nbsp;엘리베이터를&amp;nbsp;움직이기&amp;nbsp;위해서&amp;nbsp;버튼&amp;nbsp;한&amp;nbsp;번당&amp;nbsp;마법의&amp;nbsp;돌&amp;nbsp;한&amp;nbsp;개를&amp;nbsp;사용하게&amp;nbsp;됩니다.예를&amp;nbsp;들어,&amp;nbsp;16층에&amp;nbsp;있는&amp;nbsp;민수가&amp;nbsp;0층으로&amp;nbsp;가려면&amp;nbsp;-1이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;6번,&amp;nbsp;-10이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;1번&amp;nbsp;눌러&amp;nbsp;마법의&amp;nbsp;돌&amp;nbsp;7개를&amp;nbsp;소모하여&amp;nbsp;0층으로&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;하지만,&amp;nbsp;+1이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;4번,&amp;nbsp;-10이&amp;nbsp;적힌&amp;nbsp;버튼&amp;nbsp;2번을&amp;nbsp;누르면&amp;nbsp;마법의&amp;nbsp;돌&amp;nbsp;6개를&amp;nbsp;소모하여&amp;nbsp;0층으로&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;마법의&amp;nbsp;돌을&amp;nbsp;아끼기&amp;nbsp;위해&amp;nbsp;민수는&amp;nbsp;항상&amp;nbsp;최소한의&amp;nbsp;버튼을&amp;nbsp;눌러서&amp;nbsp;이동하려고&amp;nbsp;합니다.&amp;nbsp;민수가&amp;nbsp;어떤&amp;nbsp;층에서&amp;nbsp;엘리베이터를&amp;nbsp;타고&amp;nbsp;0층으로&amp;nbsp;내려가는데&amp;nbsp;필요한&amp;nbsp;마법의&amp;nbsp;돌의&amp;nbsp;최소&amp;nbsp;개수를&amp;nbsp;알고&amp;nbsp;싶습니다.&amp;nbsp;민수와&amp;nbsp;마법의&amp;nbsp;엘리베이터가&amp;nbsp;있는&amp;nbsp;층을&amp;nbsp;나타내는&amp;nbsp;정수&amp;nbsp;storey&amp;nbsp;가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;0층으로&amp;nbsp;가기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;마법의&amp;nbsp;돌의&amp;nbsp;최소값을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제한사항&lt;/b&gt; &lt;br /&gt;1&amp;nbsp;&amp;le;&amp;nbsp;storey&amp;nbsp;&amp;le;&amp;nbsp;100,000,000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 48px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;storey&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;result&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;16&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;6&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;2554&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;16&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력&amp;nbsp;예&amp;nbsp;설명 &lt;br /&gt;&lt;b&gt;입출력&amp;nbsp;예&amp;nbsp;#1&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;문제&amp;nbsp;예시와&amp;nbsp;같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;입출력&amp;nbsp;예&amp;nbsp;#2&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;-1,&amp;nbsp;+100이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;4번,&amp;nbsp;+10이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;5번,&amp;nbsp;-1000이&amp;nbsp;적힌&amp;nbsp;버튼을&amp;nbsp;3번&amp;nbsp;누르면&amp;nbsp;0층에&amp;nbsp;도착&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그러므로&amp;nbsp;16을&amp;nbsp;return&amp;nbsp;합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 아이디어&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 낮은 자릿수부터 높은 자릿수로 올라가며 처리 (오른쪽 &amp;rarr; 왼쪽 순회)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;일의 자리(가장 낮은 자리)부터&lt;/b&gt; 확인하여 필요한 만큼 버튼을 누르는 횟수를 계산하고, 그 자릿수에 대한 처리가 끝나면 &lt;b&gt;다음 높은 자릿수&lt;/b&gt;로 넘어가는 방식을 사용&lt;/li&gt;
&lt;li&gt;계산 과정에서 올림(carry)가 발생하면, 다음 높은 자릿수에 영향을 끼친다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자리 올림이 연쇄적으로&lt;/b&gt; 일어나면서 버튼 누르는 횟수를 최소화할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. 규칙 기반 &quot;올림&quot;(carry) 여부를 판단하는 조건 분기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 수에 이전 단계의 carry를 합친 값(current)을 기준으로 규칙 판단&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;current &amp;lt; 5:&lt;/b&gt;&amp;nbsp; &amp;rarr; 내림 버튼 누르기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) current 3이라면, -3 버튼을 세 번 누르면 0이 됨&lt;/li&gt;
&lt;li&gt;누른 횟수 = 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;current &amp;gt; 5:&lt;/b&gt; &amp;rarr; 올림 버튼 누르기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;current&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 7이면 +3 버튼을 세 번 눌러서 10으로 만들어 0으로 내린 후, 상위 자릿수에 &lt;b&gt;올림(carry) 1&lt;/b&gt;을 전달&lt;/li&gt;
&lt;li&gt;누른 횟수 = 10 - 7 = 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;current == 5:&lt;/b&gt; 이 경우가 가장 고민되는 케이스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 자릿수(즉, 더 높은 자릿수)가 &lt;b&gt;5 이상&lt;/b&gt;이면, 이 자릿수를 10으로 만드는 게 더 이득이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;다음 자릿수가 4 이하라면, 이 자릿수를 단순히 5만큼 내리는 것이 이득이다.&lt;/li&gt;
&lt;li&gt;이를 위해 다음 자릿수 값이 5 이상인지를 보고 올림(carry) 여부를 판단.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 가장 높은 자리의 carry 처리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 자릿수(문자열을 오른쪽&amp;rarr;왼쪽으로 돈 뒤)를 처리하고 나서도, carry가 남아있을 수 있다.&lt;/li&gt;
&lt;li&gt;ex) 9999 -&amp;gt; 10000 -&amp;gt; 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 아이디어 구현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 낮은 자릿수부터 높은 자릿수로 올라가며 처리 (오른쪽 &amp;rarr; 왼쪽 순회)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1737811939597&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for i in range(len(str(storey))-1, -1, -1):
        current = int(str(storey)[i]) + carry
        carry = 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 숫자에 이전 carry를 추가해 현재 자릿수( current )를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 규칙 기반 &quot;올림&quot;(carry) 여부를 판단하는 조건 분기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1737812024632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        if current &amp;gt; 5 :
            answer += (10 - current)
            carry += 1
            prev = current
        elif current &amp;lt; 5:
            answer += current
            prev = current
        else:
            answer += 5
            prev = 5
            
            if i &amp;gt; 0:
                if int(str(storey)[i-1]) &amp;gt;= 5:
                    carry += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;current가 5가 아닐 경우, 조건에 맞게 분기한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;current가 5일 경우, 앞의 숫자에 따라 carry를 추가할 지 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 가장 높은 자리의 carry 처리&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1737812189281&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if carry &amp;gt; 0:
    answer += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1737812266819&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(storey):
    answer = 0
    
    carry = 0
    prev = 0
    current = 0
    for i in range(len(str(storey))-1, -1, -1):
        
        current = int(str(storey)[i]) + carry
        carry = 0
        
        if current &amp;gt; 5 :
            answer += (10 - current)
            carry += 1
            prev = current
        elif current &amp;lt; 5:
            answer += current
            prev = current
        else:
            answer += 5
            prev = 5
          
            if i &amp;gt; 0:
                if int(str(storey)[i-1]) &amp;gt;= 5:
                    carry += 1
                
    if carry &amp;gt; 0:
        answer += 1
            
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/코딩테스트 연습</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/36</guid>
      <comments>https://graydonkey.tistory.com/36#entry36comment</comments>
      <pubDate>Sat, 25 Jan 2025 22:33:33 +0900</pubDate>
    </item>
    <item>
      <title>LRU 알고리즘</title>
      <link>https://graydonkey.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 알고리즘 문제를 계속해서 풀다보니, 기억이 잘 안나는 알고리즘을 여기에 정리하겠다. LRU 알고리즘은 OS 시간에 언뜻 배운 것 같은데, 확실하게 기억나지는 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;LRU (Least Recently Used)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LRU (Least Recently Used) 알고리즘은 캐시 관리에서 사용되는 알고리즘으로, 가장 최근에 사용되지 않은 데이터를 제거하여 새로운 데이터를 저장하는 방식이다. 이 알고리즘은 자주 사용되는 데이터는 캐시에서 오래 유지하고, 드물게 사용되는 데이터는 캐시에서 제거하여 시스템 성능을 최적화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 사용될 때마다 이를 기록하고, 캐시의 용량이 가득 차면 가장 오래된 데이터를 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 캐시 관리&lt;/li&gt;
&lt;li&gt;데이터베이스 캐시&lt;/li&gt;
&lt;li&gt;웹 브라우저 캐시 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현은 일반적으로 적은 캐시 용량에서는 deque로 해도 되지만, 파이썬을 사용중이라면 orderedDict를 고려해보는 것도 괜찮을 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 블로그에서 OrderedDict를 사용해 LRU를 구현하는 문제를 풀이하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/python-collections-ordered-dict/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.daleseo.com/python-collections-ordered-dict/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737012370374&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[파이썬] collections 모듈의 OrderedDict 클래스 사용법&quot; data-og-description=&quot;Engineering Blog by Dale Seo&quot; data-og-host=&quot;www.daleseo.com&quot; data-og-source-url=&quot;https://www.daleseo.com/python-collections-ordered-dict/&quot; data-og-url=&quot;https://www.daleseo.com/python-collections-ordered-dict/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcPyAn/hyX4lX7042/HKdfqpMZN4UtRyBcdGgcKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/python-collections-ordered-dict/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.daleseo.com/python-collections-ordered-dict/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcPyAn/hyX4lX7042/HKdfqpMZN4UtRyBcdGgcKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[파이썬] collections 모듈의 OrderedDict 클래스 사용법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Engineering Blog by Dale Seo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.daleseo.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그에서 LRU 알고리즘을 이해하기 쉽게 설명해두었다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dailylifeofdeveloper.tistory.com/355&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dailylifeofdeveloper.tistory.com/355&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737012182187&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;LRU 알고리즘 (Least Recentely Used) 개념 및 구현방법&quot; data-og-description=&quot;안녕하세요! daily_D 입니다!  &amp;zwj;  오늘은 페이지 교체 알고리즘 중에서 LRU에 대해서 공부해볼까요?! LRU 란? LRU(Least Recently Used)는 가장 오랫동안 참조되지 않은 페이지를 교체하는 방식입니&quot; data-og-host=&quot;dailylifeofdeveloper.tistory.com&quot; data-og-source-url=&quot;https://dailylifeofdeveloper.tistory.com/355&quot; data-og-url=&quot;https://dailylifeofdeveloper.tistory.com/355&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/clkDlD/hyX0tQ2D9B/J8KgG1SQxV50HACH5qQyv1/img.png?width=800&amp;amp;height=654&amp;amp;face=0_0_800_654,https://scrap.kakaocdn.net/dn/3eqdd/hyX0rZY0br/RhdG1JY9qnxmF1so4snyOk/img.png?width=800&amp;amp;height=654&amp;amp;face=0_0_800_654,https://scrap.kakaocdn.net/dn/bsvrLv/hyX0ohWJ9F/0AHlW3LEz1xYv2Qd40WT10/img.jpg?width=751&amp;amp;height=751&amp;amp;face=165_286_407_550&quot;&gt;&lt;a href=&quot;https://dailylifeofdeveloper.tistory.com/355&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dailylifeofdeveloper.tistory.com/355&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/clkDlD/hyX0tQ2D9B/J8KgG1SQxV50HACH5qQyv1/img.png?width=800&amp;amp;height=654&amp;amp;face=0_0_800_654,https://scrap.kakaocdn.net/dn/3eqdd/hyX0rZY0br/RhdG1JY9qnxmF1so4snyOk/img.png?width=800&amp;amp;height=654&amp;amp;face=0_0_800_654,https://scrap.kakaocdn.net/dn/bsvrLv/hyX0ohWJ9F/0AHlW3LEz1xYv2Qd40WT10/img.jpg?width=751&amp;amp;height=751&amp;amp;face=165_286_407_550');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LRU 알고리즘 (Least Recentely Used) 개념 및 구현방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! daily_D 입니다!  &amp;zwj;  오늘은 페이지 교체 알고리즘 중에서 LRU에 대해서 공부해볼까요?! LRU 란? LRU(Least Recently Used)는 가장 오랫동안 참조되지 않은 페이지를 교체하는 방식입니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dailylifeofdeveloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/알고리즘</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/35</guid>
      <comments>https://graydonkey.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 16 Jan 2025 16:26:40 +0900</pubDate>
    </item>
    <item>
      <title>Batch normalization</title>
      <link>https://graydonkey.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Batch Normalization&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 정규화(Batch Normalization)는 딥러닝 모델의 학습을 가속화하고 안정성을 높이기 위해 사용된다. 신경망의 각 층에서 입력 데이터를 정규화하여 내부 공변량 변화(Internal Covariate Shift)를 줄이고, 학습 과정을 더욱 효율적으로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;배치 정규화의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Internal Covariate Shift&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델의 각 층에서 &lt;b&gt;입력 데이터 분포가 학습 중에 변화&lt;/b&gt;하는 현상을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Back propagation 시에 이전 레이어의 출력값은 해당 층의 가중치와 함께 업데이트 된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이때, 매번 이전 층의 출력값(다음 층의 입력값)이 계속해서 변화하게 되어 입력 데이터의 분포가 안정적으로 유지되지 않는다.&lt;/li&gt;
&lt;li&gt;그 결과, 학습 모델이 불안정해지고, 학습 속도가 느려질 뿐만 아니라 그라디언트 소실 문제를 유발할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1805.11604&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; How Does Batch Normalization Help Optimization?&lt;/a&gt; 논문에서 Batch Normalization이 학습을 잘되게 하는 주요 원인이 &lt;b&gt;Internal Covariate Shift를 줄이는 것과 무관하다&lt;/b&gt;고 주장하고 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핵심적인 메커니즘&lt;/b&gt;으로 간주하기에는 한계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Loss Landscape Smoothing&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradient descent가 이동하는 손실함수의 표면을 평탄하게 만드는 것을 의미한다. Batch Normalization이 데이터의 분포를 정규화하면서 학습 과정에서의 손실 함수가 덜 비선형적이고, 지역 최저점(Local Minima) 문제를 피하기 쉽게 만든다. 이로 인해 더 큰 학습률을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;배치 정규화의 동작 원리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W86MA/btsLNU8mOOG/wSik3kkoGctTrvrLaYD6pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W86MA/btsLNU8mOOG/wSik3kkoGctTrvrLaYD6pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W86MA/btsLNU8mOOG/wSik3kkoGctTrvrLaYD6pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW86MA%2FbtsLNU8mOOG%2FwSik3kkoGctTrvrLaYD6pK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;411&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균과 표준편차는 미니배치 단위로 정규화를 진행한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미니배치의 크기는 m, 데이터 차원은 d이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 가능한 파라미터&lt;/b&gt;는 &lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;gamma;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (스케일)와 &lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (시프트)이다. 데이터 정규화 시 활성화 함수의 비선형성을 유지한다.&lt;/li&gt;
&lt;li&gt;학습되지 않는 파라미터는 running_mean, running_var이 있다. Inference시에 사용된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;입실론은 0으로 나눠지는 문제를 막기 위해 매우 작은 숫자로 설정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;활성화 함수의 비선형성 소멸?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OjKdA/btsLP42hWQn/MJgbkMG2Yj3L4XWMweghC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OjKdA/btsLP42hWQn/MJgbkMG2Yj3L4XWMweghC1/img.png&quot; data-alt=&quot;Sigmoid function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OjKdA/btsLP42hWQn/MJgbkMG2Yj3L4XWMweghC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOjKdA%2FbtsLP42hWQn%2FMJgbkMG2Yj3L4XWMweghC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;800&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Sigmoid function&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 계속 정규화하면, 비선형성이 약화될 수 있다. 예를 들어 Sigmoid function에서 입력값이 0에 가까울수록 출력값이 선형적으로 변화하는 경향이 있다. 정규화를 반복적으로 적용하면 입력 데이터의 분포가 좁아지고, 대부분의 값이 Sigmoid 함수의 중간 영역(선형 구간)에 집중될 가능성이 높다. 이로 인해 Sigmoid 함수의 비선형 특성이 제대로 발휘되지 못하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Batch Normalization은 스케일(&amp;gamma;)과 시프트(&amp;beta;)를 활용하여 비선형성을 유지한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&amp;gamma;&lt;/span&gt;&lt;/span&gt;와 &lt;span&gt;&lt;span&gt;&amp;beta;&lt;/span&gt;&lt;/span&gt;를 적용해 데이터의 분포 조정&lt;/li&gt;
&lt;li&gt;데이터가 Sigmoid 함수의 비선형 구간(포화 영역)에도 도달할 수 있도록 유도&lt;/li&gt;
&lt;li&gt;정규화로 인한 분포 집중 현상을 완화, 활성화 함수의 비선형성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Inference&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추론에는 배치 단위의 평균과 분산을 구할 수 없다. 때문에 학습때와 다른 방식으로 동작한다. 모집단 추정 방식이나 이동평균 방식을 사용한다. 이동 평균 방식에서는 학습 중에 기록해둔 sample mean, sample variance를 기반으로 running_mean, running_var을 계산하여 정규화를 수행한다. 이를 통해 추론 시 일관성을 유지하고, 배치 크기에 의존하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모집단 추정 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J9HUR/btsLP1Ewi75/N2CP9aVkKWQe0SUn4qKsTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J9HUR/btsLP1Ewi75/N2CP9aVkKWQe0SUn4qKsTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J9HUR/btsLP1Ewi75/N2CP9aVkKWQe0SUn4qKsTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ9HUR%2FbtsLP1Ewi75%2FN2CP9aVkKWQe0SUn4qKsTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;202&quot; height=&quot;70&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이동 평균 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pk90t/btsLOMu3VXr/LjhoNF1Pt66PxXQ9XPKDI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pk90t/btsLOMu3VXr/LjhoNF1Pt66PxXQ9XPKDI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pk90t/btsLOMu3VXr/LjhoNF1Pt66PxXQ9XPKDI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPk90t%2FbtsLOMu3VXr%2FLjhoNF1Pt66PxXQ9XPKDI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;79&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동 평균 방식의 장점은 학습 중 실시간으로 평균과 분산을 업데이트하며, 추가 계산 없이 추론에 활용할 수 있다. 때문에 대규모 데이터를 처리할 수 있고, 추론의 일관성을 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Bessel's Correction&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;분산 추정의 &lt;/span&gt;&lt;b&gt;편향을 줄이고&lt;/b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt; 더 정확한 &lt;/span&gt;&lt;b&gt;모집단 분산 추정&lt;/b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;을 할 수 있다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Batch Normalization의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 학습 안정성 향상 - Internal Covariate Shift 완화&lt;b&gt;, &lt;/b&gt;Loss Landscape Smoothing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 학습 속도 향상 - 높은 학습률 사용 가능, 입력 정규화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 초기화 민감도 감소 - 초기화 값에 따른 모델 민감도 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 오버피팅 방지 - 일종의 Regularization 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 깊은 네트워크에서 효과적 - Gradient Vanishing, Exploding Gradient 완화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 활성화 함수 선택의 유연성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 하이퍼파라미터 튜닝 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Batch Normalization의 한계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 소규모 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 시계열 모델에서의 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift &lt;a href=&quot;https://arxiv.org/abs/1502.03167&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/1502.03167&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2] How Does Batch Normalization Help Optimization? &lt;a href=&quot;https://arxiv.org/abs/1805.11604&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/1805.11604&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[3] &lt;a href=&quot;https://www.youtube.com/watch?v=LpXeOt3xmhM&amp;amp;t=3s&quot;&gt;https://www.youtube.com/watch?v=LpXeOt3xmhM&amp;amp;t=3s&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[4] &lt;a href=&quot;https://cvml.tistory.com/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cvml.tistory.com/5&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[5] &lt;a href=&quot;https://eehoeskrap.tistory.com/430&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eehoeskrap.tistory.com/430&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[6] &lt;a href=&quot;https://velog.io/@js03210/Deep-Learning-Batch-Normalization-%EB%B0%B0%EC%B9%98-%EC%A0%95%EA%B7%9C%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@js03210/Deep-Learning-Batch-Normalization-%EB%B0%B0%EC%B9%98-%EC%A0%95%EA%B7%9C%ED%99%94&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[7]&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Batch_normalization&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://en.wikipedia.org/wiki/Batch_normalization&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Neural Network</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/34</guid>
      <comments>https://graydonkey.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 15 Jan 2025 22:53:01 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 LV2 다리를 지나는 트럭</title>
      <link>https://graydonkey.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;다리를 지나는 트럭&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 설명 &amp;amp; 조건 확인&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;제한 조건&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bridge_length는 1 이상 10,000 이하입니다.&lt;/li&gt;
&lt;li&gt;weight는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;10,000&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;li&gt;truck_weights의&amp;nbsp;길이는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;10,000&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;li&gt;모든&amp;nbsp;트럭의&amp;nbsp;무게는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;weight&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;bridge_length&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;weight&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;truck_weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;[7,4,5,6]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;핵심 아이디어&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 다리 위 상태 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 큐를 활용해 (트럭 무게, 남은 시간) 형태로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 매 tick 마다 트럭 이동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 남은 시간 0인 트럭 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 새로운 트럭 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다리 현재 무게, 최대 무게 조건을 사용해 새로운 트럭을 다리에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736653316164&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
def solution(bridge_length, weight, truck_weights):
    answer = 0
    tick = 0
    bridge = deque()
    bridge_weight = 0
    
    i = 0
    while i &amp;lt; len(truck_weights) or bridge:
        
        tick += 1
        
        if bridge and bridge[0][1] == 0:
            truck = bridge.popleft()
            bridge_weight -= truck[0]
            
        if i &amp;lt; len(truck_weights):
            if bridge_weight + truck_weights[i] &amp;lt;= weight and len(bridge) &amp;lt; bridge_length:
                bridge.append((truck_weights[i], bridge_length))
                bridge_weight += truck_weights[i]

                i += 1

        bridge = deque((w, t-1) for w, t in bridge)
    
    
    return tick&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;핵심 아이디어 구현 부분&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 다리 위 상태 관리 &amp;amp; 트럭 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736654341400&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bridge = deque((w, t-1) for w, t in bridge)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 tick 마다 트럭이 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 남은 시간 0인 트럭 제거&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736654609947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if bridge and bridge[0][1] == 0:
    truck = bridge.popleft()
    bridge_weight -= truck[0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동이 끝난 트럭(남은 시간 0)인 트럭을 제거한다. 이때, bridge_weight에서 트럭의 무게도 함께 뺀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 새로운 트럭 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736654727203&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if i &amp;lt; len(truck_weights):
    if bridge_weight + truck_weights[i] &amp;lt;= weight and len(bridge) &amp;lt; bridge_length:
        bridge.append((truck_weights[i], bridge_length))
        bridge_weight += truck_weights[i]

        i += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 대기중인 트럭이 존재할 때, 다리 무게와 새로운 트럭의 무게, 문제의 길이 조건을 같이 검사한 후 적합하다면 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Test Case&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 111px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;입력&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;&lt;span&gt;2&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;, [&lt;span&gt;7&lt;/span&gt;, &lt;span&gt;4&lt;/span&gt;, &lt;span&gt;5&lt;/span&gt;, &lt;span&gt;6&lt;/span&gt;]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;100&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;100, [10]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;100&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;100, [10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;10]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/코딩테스트 연습</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/33</guid>
      <comments>https://graydonkey.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 12 Jan 2025 13:05:27 +0900</pubDate>
    </item>
    <item>
      <title>AlphaFold - Improved protein structure prediction using potentials from deep learning 1 [성능]</title>
      <link>https://graydonkey.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 작년 가을, 알파폴드의 개발자들이 노벨 화학상을 수상했다. 알파폴드는 단백질의 아미노산 서열로부터 3D 구조를 예측하는 모델이다. 인공지능이 실제 과학적 문제 해결에 실질적으로 도움을 준 사례라고 할 수 있겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 겨울, 알파폴드 1, 2에 대해 논문을 리뷰하고 어떻게 인공지능을 사용해 문제를 해결했는지에 대해 알기 위해 스터디를 시작했다. 본 글에서는 먼저 알파폴드 1에 대한 내용을 리뷰한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 논문을 리뷰함에 있어서 사전 지식이 부족한 상태로 논문을 읽었더니 이해하는 데 있어 어려움이 많았다. 이에 아래에 간단하게 사전 지식을 정리하고 논문 리뷰를 시작하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사전 지식 정리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 아미노산&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY0GPr/btsLImCnPgP/IkWtgIgjcwGHKhH3Mhrta1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY0GPr/btsLImCnPgP/IkWtgIgjcwGHKhH3Mhrta1/img.png&quot; data-alt=&quot;아미노산 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY0GPr/btsLImCnPgP/IkWtgIgjcwGHKhH3Mhrta1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY0GPr%2FbtsLImCnPgP%2FIkWtgIgjcwGHKhH3Mhrta1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;215&quot; height=&quot;127&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아미노산 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아미노산은 알파탄소 C&amp;alpha;, 3개의 R기, 아미노기, 카복시기로 이루어진다. R기에 따라 아미노산이 결정된다. 알파탄소에 결합된 R기의 첫 번째 탄소가 베타탄소 C&amp;beta;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 단백질 : &lt;/b&gt;아미노산이 결합하여 형성된 복합체이다. 폴리펩타이드는 단순히 아미노산들이 연결된 구조를 의미하며, 연결된 구조에 따라 1, 2, 3, 4차 구조로 나뉜다. 여기에서 한 개의 폴리펩타이드가 R기 간의 상호작용, 수소결합 등으로 인해 구조적으로 접혀 입체 구조를 띄는 구조가 3차 구조이다. 알파폴드 1에서 다루는 구조가 3차 구조이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 단백질은 아미노산 서열이 3차원적으로 결합된 구조이다. 알파폴드는 딥러닝을 사용하여 단백질의 서열만을 사용해 단백질 구조를 예측한다. 그렇다면 왜 3D 구조를 예측할까? 그에 대한 해답은 단백질의 3차원적 구조가 곧 기능을 나타내기 때문이다. 즉, 단백질의 기능이 그 구조에 따라 달라지며, 3D 구조를 예측하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단백질 구조는 실험적으로 결정하기 매우 어렵고, 시간이 많이 걸린다. 알파폴드는 아미노산 간 거리 예측을 통해 단백질의 형태를 보다 더 정확하게 예측할 수 있으며, 이를 통해 실험적으로 구조를 결정하지 않고도 기능에 대한 통찰을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알파폴드, 얼마나 뛰어난가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8oFpW/btsLHTnn9lH/nRLO38YDZHSlJ8DDJfO1G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8oFpW/btsLHTnn9lH/nRLO38YDZHSlJ8DDJfO1G1/img.png&quot; data-alt=&quot;CASP13 다른 모델들과의 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8oFpW/btsLHTnn9lH/nRLO38YDZHSlJ8DDJfO1G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8oFpW%2FbtsLHTnn9lH%2FnRLO38YDZHSlJ8DDJfO1G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1136&quot; height=&quot;371&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CASP13 다른 모델들과의 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 그래프는 알파폴드와 다른 모델들과의 성능을 비교한 내용이다. 단백질 구조 예측 분야에서 권위있는 대회인 CASP13에서 평가된 지표로, 2018년 AlphaFlod가 다른 예측 방법들에 비해 월등히 높은 정확도를 기록한 모습을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프를 명확히 이해하기 위해 용어를 정리하고 넘어가겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TM Score :&amp;nbsp;&lt;/b&gt;단백질 구조 예측의 정확도를 평가하는 지표이다. 0 ~ 1의 값을 가지며, 1에 가까울수록 실제구조와 예측 구조가 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FM(Free Modeling) : &lt;/b&gt;단백질 구조 예측에서 가장 어려운 유형이다. 이 도메인에 대한 예측은 실험적으로 알려진 구조가 없고, 서열만 주어졌을 때 예측하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;- &lt;b&gt;FM 도메인&lt;/b&gt;은 자유 모델링으로, 다른 방법보다 샘플링 절차, 접촉 정보 없이 순수한 예측을 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;b&gt;FM/TBM 도메인&lt;/b&gt;은 FM 도메인에 TBM을 결합한 도메인이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TBM(Template-based Modeling) :&amp;nbsp;&lt;/b&gt;단백질 구조 예측 방법 중 하나로, 기존에 알려진 단백질 구조(템플릿)을 이용하여 새로운 단백질의 구조를 예측하는 방식이다. 주어진 단백질 서열에 대해 이미 실험적으로 결정된 단백질 구조를 참고(템플릿)으로 사용하여 예측을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TBM의 동작 원리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 템플릿 검색 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 단백질 서열을 바탕으로, 기존에 알려진 단백질 구조 중 먼저 유사한 서열을 서열 비교 기법을 통해 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서열 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾은 유사 서열(템플릿)과 예측하려는 단백질 서열을 정렬한다. 이 과정에서 템플릿의 구조적 정보를 예측하려는 서열에 맞게 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 구조 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 구조를 사용해 서열의 차이를 반영하며 새로운 단백질 구조를 예측한다. 템플릿 구조적 특징을 바탕으로 단백질 서열이 어떻게 접히고, 3D 구조가 형성되는지 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Target :&amp;nbsp;&lt;/b&gt;대회에서 예측하고자 하는 단백질 구조이다. 이 중 마지막 T1017s2-D1은 단백질 구조가 공개되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;a. Comparison of FM Domain Predictions Across Different TM-Score Thresholds &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파폴드와 다른 97개의 그룹들이 TM-score 임계값을 기준으로 예측한 FM 도메인의 개수를 비교하는 그래프이다. FM+FM/TBM 도메인 수는 FM 도메인, FM/TBM 도메인의 예측 정확도를 TM-score 기준으로 구분한 도메인의 총합이다. 즉, 알파폴드가 예측한 FM 도메인 수와 FM/TBM 도메인을 합산해 비교한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 a는 다른 모델들보다 알파폴드가 뛰어난 성과를 보이고 있음을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;b. TM Score Comparison for Six New Folds Identified in CASP13&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CASP13 대회에서 새롭게 식별한 6개의 단백질에 대해 알파폴드, 다른 방법들의 TM score를 비교하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;c&lt;/b&gt;: &lt;b&gt;Precision of Long-Range Contact Predictions in CASP13&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파폴드와 다른 두 알고리즘의 장거리 접촉 예측 지표를 나타내고 있다. 장거리 접촉 예측은 단백질 구조상 멀리 떨어져 있지만, 상호작용하는 아미노산들을 예측하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 &lt;b&gt;L/1&lt;/b&gt;은 전체 도메인에 대한 접촉 예측 즉, 예측된 모든 장거리 접촉을 대상으로 평가한 지표이다. 모든 접촉 예측에 대한 정밀도를 나타내고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;L/2&lt;/b&gt;는 상위 절반의 접촉에 해당하는 장거리 접촉 예측 정확도, &lt;b&gt;L/5&lt;/b&gt;은 가장 신뢰할 수 있는 상호작용 중 상위 20%를 포함한 예측의 정확도를 평가한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이전의 연구 중 가장 성공적이었던 방법은 Fragment Assembly 접근법이었다. 단백질 구조를 생성하는 데 확률적 샘플링 과정을 사용한다. 논문에서 소개하고 있는 방법 중 하나는 Simulated Annealing으로, 단백질 구조가 더욱 낮은 에너지를 가지도록 수렴하게 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fragment Assembly 방식에서 구조를 변경할 때 짧은 부분을 변경하면서 형성된다. 그 과정에서 변경된 부분의 에너지가 낮아지는 경우 그 변경을 유지하면서 구조를 반복적으로 수정하게 된다. 그러나 Simulated Annealing은 충족되는 답을 얻기까지 매우 많은 반복을 진행해야 한다는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 다른 방법 중 하나는 신경망을 이용한 방법이 있다. MSA에서 계산된 특징을 바탕으로 두 아미노산이 접촉할 확률을 예측한다. 접촉 예측은 구조 예측 과정에서 사용되며 예측된 접촉이 더 많이 충족되는 구조로 유도하며 통계적인 잠재적 에너지를 수정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* MSA(Multiple Sequence Alignment)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNA/RNA 서열을 정렬해 각 서열에서 유사한 부분을 비교하고 차이를 식별하는 방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글이 길어져서 논문 내용을 분리해 포스팅하겠다.&lt;/p&gt;</description>
      <category>개발/논문 리뷰</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/31</guid>
      <comments>https://graydonkey.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 8 Jan 2025 23:24:26 +0900</pubDate>
    </item>
    <item>
      <title>Transformer Is All You Need</title>
      <link>https://graydonkey.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 논문 리뷰를 통해 모호하게 알고 있던 개념을 확실하게 잡고 넘어가고자 글을 작성하게 되었다. 이 카테고리에는 필자의 관심영역의 연구들을 리뷰하고, 가능하다면 구현해보려 한다. 다만 현재 나오고 있는 LLM을 비롯한 거대한 AI 모델들은 학습시키기에 매우 많은 자원이 필요하기 때문에 풀 튜닝은 어렵더라도 LoRA 기법을 활용해 파인튜닝을 하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 나오고 있는 Chat Gpt 같은 LLM 모델들은 Attention을 기반으로 하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Abstract.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer 이전의 RNN 계열 모델들은 sequence 데이터를 처리할 때 순차적으로 데이터를 처리했다. 대표적으로 LSTM, GRU 모델들은 gate mechanism을 통해 선택적으로 중요한 정보는 남기고, 필요없는 정보는 사라지게 했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coL4nq/btsLFc9orel/L9Gj1SN99qGeqWupmKmg3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coL4nq/btsLFc9orel/L9Gj1SN99qGeqWupmKmg3k/img.png&quot; data-alt=&quot;LSTM 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coL4nq/btsLFc9orel/L9Gj1SN99qGeqWupmKmg3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoL4nq%2FbtsLFc9orel%2FL9Gj1SN99qGeqWupmKmg3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;239&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LSTM 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 모델들은 딥러닝 모델에서 발생할 수 있는 Gradient Vanishing 문제를 나름 효과적으로 처리할 수 있었지만, 극복하지는 못했다. Transformer 이전에 제안된 일부 모델들은 이런 RNN 구조에 attention 메커니즘을 붙여 연구가 진행되었으나, 여전히 한계가 존재하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer는 RNN 계열의 문제를 해결하기 위해 제안된 모델로 encoder와 decoder에 attention 메커니즘을 결합한 새로운 구조를 제안한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Model Architecture&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9X2wR/btsLFxSVTbV/s0qk446CJl8ZsxJHm1mZ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9X2wR/btsLFxSVTbV/s0qk446CJl8ZsxJHm1mZ7K/img.png&quot; data-alt=&quot;Transformer 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9X2wR/btsLFxSVTbV/s0qk446CJl8ZsxJHm1mZ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9X2wR%2FbtsLFxSVTbV%2Fs0qk446CJl8ZsxJHm1mZ7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;262&quot; height=&quot;386&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1885&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Transformer 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer는 크게 두 개의 구조로 이루어져 있다. Encoder, decoder 모두 N = 6으로, 각각 6개의 블럭을 직렬로 통과한다. Encoder에서 나온 출력이 decoder로 들어갈 때, 각 블럭마다 decoder에서 생성된 벡터(Query)에 encoder의 출력(Key, Value)을 붙여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Encoder :&amp;nbsp; &lt;/b&gt;Multi-Head Attention, FFN, residual connection 으로 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Decoder :&amp;nbsp;&lt;/b&gt;두 개의 Multi-Head Attention, FFN, residual connection 으로 이루어진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Attention&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention은 Q, K, V 행렬 즉, query, keys, values 값을 사용한다. Query는 현재 관심 대상, Key는 모든 잠재적 관심 대상, Value는 참조 대상의 정보를 표현한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Scaled Dot-Product Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUCt60/btsLF2LxlK7/qBrDPk6fZysvhoJ9tclrR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUCt60/btsLF2LxlK7/qBrDPk6fZysvhoJ9tclrR0/img.png&quot; data-alt=&quot;Scaled Dot-Product Attention&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUCt60/btsLF2LxlK7/qBrDPk6fZysvhoJ9tclrR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUCt60%2FbtsLF2LxlK7%2FqBrDPk6fZysvhoJ9tclrR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;248&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Scaled Dot-Product Attention&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 attention 계산을 Scaled Dot-Product Attention이라고 한다. 여기에서 attention 메커니즘이 어떻게 동작하는지 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/syQD6/btsLFzi06MB/kbKQUgtNvbWmkK8n2OdLR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/syQD6/btsLFzi06MB/kbKQUgtNvbWmkK8n2OdLR1/img.png&quot; data-alt=&quot;Scaled Dot-Product Attention&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/syQD6/btsLFzi06MB/kbKQUgtNvbWmkK8n2OdLR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsyQD6%2FbtsLFzi06MB%2FkbKQUgtNvbWmkK8n2OdLR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;67&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Scaled Dot-Product Attention&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식을 간략히 설명하자면 Q, K의 유사도를 곱을 통해 알아낸다. Q, K에 해당하는 의미가 비슷하다면 유사도가 커질 것이다. 매우 큰 차원 dk에 대해 해당 연산을 진행하면 레이어를 반복적으로 거칠수록 QK^T의 값은 계속해서 커지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 내적값에 softmax를 적용하면 gradient가 매우 작아지기 때문에, 스케일링 즉 dk의 제곱근으로 나눈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Softmax를 통과시키고 관련성이 높은 즉, Q와 K간의 유사도가 높은 K에 더 높은 가중치를 부과하고, 이런 가중치가 V와 곱해져 Q와 연관성이 높은 정보들만 남게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Multi-Head Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1083&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8DsVh/btsLK58OH2H/cTIkngTkHNQsVkdHzi1nsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8DsVh/btsLK58OH2H/cTIkngTkHNQsVkdHzi1nsk/img.png&quot; data-alt=&quot;Multi-Head Attention&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8DsVh/btsLK58OH2H/cTIkngTkHNQsVkdHzi1nsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8DsVh%2FbtsLK58OH2H%2FcTIkngTkHNQsVkdHzi1nsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;207&quot; height=&quot;259&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1083&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Multi-Head Attention&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-Head Attention은 위의 Scaled Dot-Product Attention을 병렬로 수행해 입력 데이터의 다양한 특징과 관계를 학습한다. 입력 데이터의 임베딩 차원 (d_model)을 h개의 헤드로 나누고, 각각 어텐션을 독립적으로 수행한다. 이후 각 헤드의 결과를 결합하고 선형 변환하여 최종 출력을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxyIyJ/btsLJ6HrqD3/S0VhdvxBGXSbwwh9PqJVZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxyIyJ/btsLJ6HrqD3/S0VhdvxBGXSbwwh9PqJVZ0/img.png&quot; data-alt=&quot;Q, K, V 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxyIyJ/btsLJ6HrqD3/S0VhdvxBGXSbwwh9PqJVZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxyIyJ%2FbtsLJ6HrqD3%2FS0VhdvxBGXSbwwh9PqJVZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;269&quot; height=&quot;25&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Q, K, V 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;110&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOzFMC/btsLK85uRmm/9CZ6nagJkekAGNJkaLOEAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOzFMC/btsLK85uRmm/9CZ6nagJkekAGNJkaLOEAK/img.png&quot; data-alt=&quot;dk&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOzFMC/btsLK85uRmm/9CZ6nagJkekAGNJkaLOEAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOzFMC%2FbtsLK85uRmm%2F9CZ6nagJkekAGNJkaLOEAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;110&quot; height=&quot;51&quot; data-origin-width=&quot;110&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dk&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGwcu/btsLKH8fkGo/HQ3LxjsgVRGhf7bTklIL10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGwcu/btsLKH8fkGo/HQ3LxjsgVRGhf7bTklIL10/img.png&quot; data-alt=&quot;Qi 의 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGwcu/btsLKH8fkGo/HQ3LxjsgVRGhf7bTklIL10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGwcu%2FbtsLKH8fkGo%2FHQ3LxjsgVRGhf7bTklIL10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;32&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Qi 의 의미&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 정의되는 Q, K, V에 대해 차원을 h개의 작은 차원 dk로 분리하면, 각 헤드가 저차원 공간에서 독립적으로 어텐션을 계산하게 된다. Q, K, V 각각은 h개의 행렬을 모두 concatination 하면 원래 형태의 행렬로 돌아오게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DbUeK/btsLKGhbZdQ/06tCSC066gV6ww4D8uZKc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DbUeK/btsLKGhbZdQ/06tCSC066gV6ww4D8uZKc1/img.png&quot; data-alt=&quot;분리된 Q, K, V&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DbUeK/btsLKGhbZdQ/06tCSC066gV6ww4D8uZKc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDbUeK%2FbtsLKGhbZdQ%2F06tCSC066gV6ww4D8uZKc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;31&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;분리된 Q, K, V&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 분리된 Q, K, V에 대해 각각의 헤드마다 어텐션을 독립적으로 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRYrB/btsLJi2PAEp/aUEG9PfplMK1ApDMm3K9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRYrB/btsLJi2PAEp/aUEG9PfplMK1ApDMm3K9y1/img.png&quot; data-alt=&quot;head 계산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRYrB/btsLJi2PAEp/aUEG9PfplMK1ApDMm3K9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRYrB%2FbtsLJi2PAEp%2FaUEG9PfplMK1ApDMm3K9y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;53&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;head 계산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;head는 앞선 Scaled Dot-Product Attention을 사용하여 계산한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKdVhQ/btsLJ59FnAO/yzv5h42TkVEjQkGROIjCBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKdVhQ/btsLJ59FnAO/yzv5h42TkVEjQkGROIjCBK/img.png&quot; data-alt=&quot;MultiHead Output&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKdVhQ/btsLJ59FnAO/yzv5h42TkVEjQkGROIjCBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKdVhQ%2FbtsLJ59FnAO%2Fyzv5h42TkVEjQkGROIjCBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;33&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MultiHead Output&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbhLLS/btsLKounjDo/Y86AO0sZCETOcEi8aJKPnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbhLLS/btsLKounjDo/Y86AO0sZCETOcEi8aJKPnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbhLLS/btsLKounjDo/Y86AO0sZCETOcEi8aJKPnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbhLLS%2FbtsLKounjDo%2FY86AO0sZCETOcEi8aJKPnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;35&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV6in3/btsLJCfKwtF/CEdOQEVpXCk3cehnPujKYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV6in3/btsLJCfKwtF/CEdOQEVpXCk3cehnPujKYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV6in3/btsLJCfKwtF/CEdOQEVpXCk3cehnPujKYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV6in3%2FbtsLJCfKwtF%2FCEdOQEVpXCk3cehnPujKYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;147&quot; height=&quot;30&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 계산된 head들을 결합하고, 선형 변환 Wo를 통해 Multi-Head Output을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 여러 개의 헤드로 나누어 학습을 진행하는 이유가 무엇일까? 그 이유는 어러 문맥 정보를 동시에 학습하기 위해서이다. 각각의 헤드가 입력 데이터의 서로 다른 부분에 집중하게 되어 각기 다른 패턴을 학습한다. 이를 통해 모델이 더욱 풍부하면서도 강력한 표현을 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 저차원 공간에서 병렬 처리를 통해 계산이 효율적으로 수행되도록 만들어준다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Applications of Attention in Transformer&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model Architecture에서 확인할 수 있듯, 어텐션은 encoder, encoder-decoder, decoder에서 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Encoder-decoder attention&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;129&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tsuek/btsLJ5V5psC/N3SCXfgAwFhZKFG4AxZjKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tsuek/btsLJ5V5psC/N3SCXfgAwFhZKFG4AxZjKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tsuek/btsLJ5V5psC/N3SCXfgAwFhZKFG4AxZjKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTsuek%2FbtsLJ5V5psC%2FN3SCXfgAwFhZKFG4AxZjKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;129&quot; height=&quot;91&quot; data-origin-width=&quot;129&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q : 이전 decoder layer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K, V : encoder의 output&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디코더의 각 위치가 인코더의 모든 위치를 참조하여 입력 시퀀스와 관련된 정보를 학습한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Encoder-Self attention&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1iGyN/btsLK2xwWst/kAckbvEoD5isXl9gYYRkN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1iGyN/btsLK2xwWst/kAckbvEoD5isXl9gYYRkN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1iGyN/btsLK2xwWst/kAckbvEoD5isXl9gYYRkN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1iGyN%2FbtsLK2xwWst%2FkAckbvEoD5isXl9gYYRkN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;134&quot; height=&quot;95&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Q, K, V :&amp;nbsp; 이전 encoder 레이어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 시퀸스의 모든 위치를 참조해 문맥 정보를 학습한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Decoder-Self attention&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1gD7y/btsLKNtPN9K/4MVFdKOTuZ1nw3XpCDrx1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1gD7y/btsLKNtPN9K/4MVFdKOTuZ1nw3XpCDrx1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1gD7y/btsLKNtPN9K/4MVFdKOTuZ1nw3XpCDrx1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1gD7y%2FbtsLKNtPN9K%2F4MVFdKOTuZ1nw3XpCDrx1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;130&quot; height=&quot;113&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Q, K, V :&amp;nbsp; 이전 decoder 레이어 (현재와 이전 위치만 참조)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디코더가 이전 단어들을 참조한다. 이때, Auto Regressive 특성을 유지해야 하기 때문에 Masking을 사용해 미래의 정보를 참조하지 않는다. 미래 시점에 해당하는 가중치 값을&amp;nbsp; &lt;span&gt;&amp;minus;&amp;infin;로 설정해 Softmax 값이 0이 되도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; Position-wise Feed-Forward Networks&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIUWgj/btsLJMJhfND/yOlyYYGlMwsPeBWw18u7Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIUWgj/btsLJMJhfND/yOlyYYGlMwsPeBWw18u7Dk/img.png&quot; data-alt=&quot;FFN 연결 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIUWgj/btsLJMJhfND/yOlyYYGlMwsPeBWw18u7Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIUWgj%2FbtsLJMJhfND%2FyOlyYYGlMwsPeBWw18u7Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;134&quot; height=&quot;88&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FFN 연결 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CYS4y/btsLJyxBr2W/ZpqFKxre7qsZHeRklYlB4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CYS4y/btsLJyxBr2W/ZpqFKxre7qsZHeRklYlB4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYS4y/btsLJyxBr2W/ZpqFKxre7qsZHeRklYlB4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYS4y%2FbtsLJyxBr2W%2FZpqFKxre7qsZHeRklYlB4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;526&quot; height=&quot;40&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer는 Attention 구조와 함께 FFN 서브레이어가 있다. 두 개의 선형 변환, ReLU로 구성된다. 두 개의 W, b는 모두 학습 가능한 파라미터이다. 물론 각각 레이어마다 서로 다른 파라미터를 사용한다. (기본 구조는 N = 6)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Embeddings and Softmax&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력과 출력 토큰은 embedding layer를 지나 d_model 차원의 벡터로 변환된다. 변환된 벡터는 토큰의 의미적(semantic) 특성을 나타내며, 모델이 학습을 통해 문맥을 더 잘 이해할 수 있도록 돕는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 논문에서는 인풋 임베딩, 아웃풋 임베딩의 가중치를 공유한다고 설명한다. 어떤 토큰의 의미를 semantic한 벡터로 변환할때 동일한 의미를 나타내는 벡터로 표현하는 것이 자연스러울 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Positional Encoding&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1PrNj/btsLLCSRjVx/FdHfpd5TjWetfOs8LNzC81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1PrNj/btsLLCSRjVx/FdHfpd5TjWetfOs8LNzC81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1PrNj/btsLLCSRjVx/FdHfpd5TjWetfOs8LNzC81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1PrNj%2FbtsLLCSRjVx%2FFdHfpd5TjWetfOs8LNzC81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;74&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer에서 sequence order를 반영하기 위해 positional encoding을 진행한다. Transformer는 RNN, CNN 과 같이 모델에서 입력의 구조를 직접 유추할 수 없기 때문에 입력 시퀸스의 순서를 모델에 직접 알려줄 필요가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pos는 입력 토큰의 위치, i는 임베딩 벡터의 차원 인덱스를 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Positional Encoding은 입력 토큰의 상대적, 절대적 위치 정보를 모델에 제공함으로써 순서 정보를 반영한다. 그 예시로PE_pos+k 는 PE_pos의 선형 조합으로 표현이 가능하다. 이는 모델이 상대적 위치를 학습하는 데 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 사인과 코사인 함수를 사용하면 사전 학습된 시퀀스 길이보다 더 긴 시퀀스에서도 잘 동작하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩 벡터에 포시셔널 인코딩 정보를 position-wise addition해 최종 입력 벡터를 만든다. 이렇게 되면 입력 데이터가 위치 정보까지 포함하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 설명은 아래 블로그를 참고하는 것이 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736679005868&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;positional encoding이란 무엇인가&quot; data-og-description=&quot;Transformer model을 살펴보면, positional encoding이 적용된다. 다음 그림은 transformer 모델에 대한 구조도 인데, positional encoding을 찾아볼 수 있다. 출처는 https://www.tensorflow.org/tutorials/text/transformer 이다. tra&quot; data-og-host=&quot;skyjwoo.tistory.com&quot; data-og-source-url=&quot;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; data-og-url=&quot;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c8JK0W/hyX0lEztsr/bdMV1x0KTmBaPKoRmK9tz1/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655,https://scrap.kakaocdn.net/dn/b3LJE3/hyX0wlNKOt/7kurkxf8y1yHYzkKh0rGK0/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655,https://scrap.kakaocdn.net/dn/tTQym/hyX0w683GU/uVDSRTaQ6Zq4HDECfpoVik/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655&quot;&gt;&lt;a href=&quot;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://skyjwoo.tistory.com/entry/positional-encoding%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c8JK0W/hyX0lEztsr/bdMV1x0KTmBaPKoRmK9tz1/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655,https://scrap.kakaocdn.net/dn/b3LJE3/hyX0wlNKOt/7kurkxf8y1yHYzkKh0rGK0/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655,https://scrap.kakaocdn.net/dn/tTQym/hyX0w683GU/uVDSRTaQ6Zq4HDECfpoVik/img.png?width=452&amp;amp;height=655&amp;amp;face=0_0_452_655');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;positional encoding이란 무엇인가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Transformer model을 살펴보면, positional encoding이 적용된다. 다음 그림은 transformer 모델에 대한 구조도 인데, positional encoding을 찾아볼 수 있다. 출처는 https://www.tensorflow.org/tutorials/text/transformer 이다. tra&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;skyjwoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Why Self-Attention&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 왜 Self Attention 메커니즘이 기존의 RNN, CNN 보다 더 효과적일까? 본 논문에서는 계산 복잡도(Computational Complexity), 병렬화 가능성(Parallelization), 경로 길이(Path Length)를 이유를 들어 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL0LmN/btsLL51pHZ2/WQ1Fr1VEDi4xkWz4zohPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL0LmN/btsLL51pHZ2/WQ1Fr1VEDi4xkWz4zohPMk/img.png&quot; data-alt=&quot;Self Attention, CNN, RNN 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL0LmN/btsLL51pHZ2/WQ1Fr1VEDi4xkWz4zohPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL0LmN%2FbtsLL51pHZ2%2FWQ1Fr1VEDi4xkWz4zohPMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;156&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Self Attention, CNN, RNN 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Computational Complexity - 계산 복잡도&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 표에서 n은 시퀀스 길이, d는 표현 차원을 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Self-Attention&lt;/b&gt;은 계산 복잡도가 O(n^2 * d)로 n &amp;lt; d인 경우 RNN보다 빠르다. &lt;b&gt;Recurrent&lt;/b&gt;는 순차적으로 계산해야 하므로 시퀀스 길이에 선형적으로 비례하며, &lt;b&gt;Convolutional&lt;/b&gt;은 커널 크기가 클 수록 연산 비용이 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Parallelization - 병렬화 가능성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Self-Attention&lt;/b&gt;은 모든 입력 위치 간 연산이 병렬적으로 처리된다. 즉 한번의 연산으로 모든 입력-출력 관계를 학습할 수 있다. 반면 &lt;b&gt;Recurrent&lt;/b&gt;의 경우 시퀸스를 순차적으로 처리해야 하기에 병렬화가 어렵다. &lt;b&gt;Convolutional&lt;/b&gt;의 경우 병렬 처리가 가능하지만, 입력과 출력 간 모든 위치를 연결하려면 여러 층이 필요하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Path Length - 경로 길이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Self-Attention&lt;/b&gt;의 경우 모든 입력, 출력 위치가 직접적으로 연결되지만, &lt;b&gt;Recurrent&lt;/b&gt;는 시퀀스를 순차적으로 처리하므로 입력과 출력간 경로 길이가 n에 비례하게 된다. &lt;b&gt;Convolutional&lt;/b&gt;에서는 커널 크기 k를 사용해 경로 길이를 줄일 수 있다. 그러나 경로 길이를 많이 줄이려면, 필연적으로 여러 층이 필요하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Self-Attention은 Path Length, Parallelization 관점에서 다른 구조들에 비해 우수함을 보인다. 그러나 시퀸스 길이가 매우 길 경우에, O(n^2)의 복잡도가 문제가 된다. 따라서, 이를 해결하기 위해 Restricted Self-Attention을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뿐만 아니라, Self Attention은 해석 가능성 측면에서도 장점을 보인다. Attention 분포를 시각화하여서, 모델이 어떤 단어간의 관계를 학습했는지 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성중 ...&lt;/p&gt;</description>
      <category>개발/논문 리뷰</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/30</guid>
      <comments>https://graydonkey.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 7 Jan 2025 22:35:09 +0900</pubDate>
    </item>
    <item>
      <title>8. Spring Boot : Thymeleaf &amp;amp; JSP</title>
      <link>https://graydonkey.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* 본 글은 벡엔드 부트캠프를 진행하며 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thymeleaf&amp;nbsp;&amp;amp;&amp;nbsp;JSP는 둘 다 웹 애플리케이션에서 뷰를 렌더링 하는 템플릿 엔진이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# Thymeleaf&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 파일 형식으로써 HTML 파일을 직접 템플릿으로 사용한다. HTML 파일을 그대로 브라우저에서 열 수 있고, 동적으로 렌더링 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 파일을 직접 템플릿으로 사용하기 때문에 HTML 친화적이다. xml등 여러 포맷도 지원하며 데이터 바인딩이 간편하다는 장점이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# JSP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.jsp 확장자를 가진 Java 기반의 템플릿 파일이다. JSP는 서블릿 기술을 기반으로 하며, HTML 코드 내에 Java 코드를 삽입할 수 있다. &amp;lt;%=... %&amp;gt; 브라킷 내에 자바코드를 삽입해서 사용할 수 있으며 JSTL 같은 태그 라이브러리를 사용하여 동적인 데이터를 처리할 수 있다. 내부에 자바 코드를 집어넣을 수 있기에 자바 환경과 친화적이라는 장점이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Spring Boot</category>
      <author>잿빛나귀</author>
      <guid isPermaLink="true">https://graydonkey.tistory.com/29</guid>
      <comments>https://graydonkey.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 30 Jul 2024 17:28:20 +0900</pubDate>
    </item>
  </channel>
</rss>