<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>공부하는 제이의 블로그</title>
    <link>https://gnoej671.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 26 Aug 2026 03:34:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>제이gnoej</managingEditor>
    <image>
      <title>공부하는 제이의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/2815536/attach/1495c4c8da264317a08664d2643a5b10</url>
      <link>https://gnoej671.tistory.com</link>
    </image>
    <item>
      <title>AI 콘텐츠 탐지기 (feat. LLM 워터마킹, GPTZero)</title>
      <link>https://gnoej671.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료 : &lt;a href=&quot;https://youtu.be/-vToUx5SDW4?si=AzCDhJ51m6VI9fvZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/-vToUx5SDW4?si=AzCDhJ51m6VI9fvZ&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=-vToUx5SDW4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ePg7c/hyUywYbl98/7vyTnC0fVVZ3KxCJkBwnZ0/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;320&quot; data-video-height=&quot;240&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-vToUx5SDW4&quot; width=&quot;320&quot; height=&quot;240&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;커피빈 선생님 최고&amp;nbsp;&lt;/figcaption&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;어떻게 AI 가 생성한 텍스트인지 알 수 있을까? 2가지 방법이 있는데 크게&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) perplexity / burstiness&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) watermarking&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;첫번째의 경우 모델이 생성한 텍스트만 (많이) 있으면 쉽게 Detector 를 만들 수 있다. (유저가 만들 수 있음)&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;1. Perplexitly / Burstiness&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT_0 가 바로 첫번째 방법으로 만들어진 모델이라고 할 수 있음 (텍스트를 복붙하면 model generated text 인지, human generated text 인지 return)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단&amp;nbsp; LLM 이 쓴 글이랑 사람이 쓴 글이랑 2가지 (perplexity / burstiness) 에서 차이가 있다는 가정에서 시작한다. &lt;b&gt;perplexity&lt;/b&gt; 의 경우 LLM 의 probability 의 반대 개념이라고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;perplexity 가 높을 수록 improbable prediction 이 많다는 의미이다 (low probability, 깜짝 놀라게 하는 prediction).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 probabliity 가 높은 prediction 일수록 perplexity 는 낮다 (high probability, 별로 놀랍지 않은 prediction).&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;즉 p(current wowrd | previous word) 을 구해야 하는데, 그럼 모델 parmeters 에 접근 계산해야 되는거 아냐? 라고 생각할 수 있다. 결과적으로 답은 NO =&amp;gt; 그냥 그 모델이 생성한 text 가 아주 많으면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 text 를 가지고 작은 generative 모델을 training 하면 그 모델의 perplexity 가 타겟 모델의 perplexity 의 근사치라고 가정하는 거임.&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;burstiness&lt;/b&gt; 라는 건 쓰인 문장들이 서로 얼마나 다양하냐? 정도로 해석할 수 있을 것 같은데 예를 들어서 사람이 글을 쓸 때 rare word 가 등장한다고 하자. 이 단어는 한 두번 쓰이다가 다른 문장에서는 안 쓰이기 때문에 문장 간 스타일이 매우 various 하다고 할 수 있음. 그런데 이에 비해서 LM 은 문장 들이 어느 정도 일정한 차이를 유지하기 때문에 burstiness 가 낮다.&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;898&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xGpy9/btsAzDaesCT/6t2tRMRm8J8TpZiPCnCtq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xGpy9/btsAzDaesCT/6t2tRMRm8J8TpZiPCnCtq0/img.png&quot; data-alt=&quot;Human : various style across sentences &amp;amp;lt;-&amp;amp;gt; Robot : consistent style across sentences&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xGpy9/btsAzDaesCT/6t2tRMRm8J8TpZiPCnCtq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxGpy9%2FbtsAzDaesCT%2F6t2tRMRm8J8TpZiPCnCtq0%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;898&quot; height=&quot;507&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Human : various style across sentences &amp;lt;-&amp;gt; Robot : consistent style across sentences&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;근데 사실 이렇게 학습된 detector 은 쉽게 속일 수 있다고 한다.&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;예를 들어 AI generated text 를 아주 살짝만 고치거나, grammar mistake, typo 등을 조금만 넣어주면 gpt0 는 속이기 쉽다고 한다. 반대로 어떤 사람이 굉장히 constant style of writing 을 가지고 있어도 이걸 AI gen text 라고 잘못 예측할 가능성이 있음 (개억울)&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;gt; 각 모델에 water mark 를 추가하는 것.&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;2. Watermarking&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 이 decoding 할 때, 즉 next word generation step 에서 가장 probable 한 단어를 선택하는 greedy search 를 사용하지 않는다 (Greedy search 를 적용하면, 계속 같은 문장이 반복될 수 있고 사람이 쓴 글이랑 너무 다르기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 가끔씩&amp;nbsp; less probable 하지만, 문장 전체의 overal score는 높게 하기 위해서 random sampling 같은 걸 한다고 한다. 간단히 말하면 가끔씩 less probable 한 단어를 선택한 다음에 얘네들 사이에서 probability 를 구하는거임&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;이 random sampling 과정에서 워터마크를 추가할 수 있다. next word prediction 을 할 때, 전체 vocabulary 의 20% 는 블랙리스트에 추가하고 나머지 80% 에서만 단어를 샘플링하고 이 중에서 probabliity를 구하고 선택하게 한다면? (이 때, previous word 를 random seed 로 쓰고, 이 시드를 각진 random number generator 가 랜덤하게 블랙리스트를 만든다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 결과적으로 이 모델은 어떤 단어 다음에는 절대로 쓰지 않는 단어가 생길 것. 이에 반해서 사람은 이런 constraint 가 없기 때문에 black list 에 들어가 있는 단어들도 쓰게 될 것. 그래서 어떤 글을 보고, black list 가 쓰여진 경우를 모두 세서 그게 높다면 사람이 쓴 글.&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;근데 가끔은 이 단어 다음에는 꼭 이게 와야 하는데, 그게 블랙리스트에 들어가면 어떻게 해? 라고 생각할 수 있는데 이런 문제를 해결하기 위해서 아래 빨간 그래프처럼 한 가지 단어의 probability 만 높고 나머지 단어들은 매우 낮은 경우 (low entropy) 이걸 적용하지 않고, high entropy 상황에서만 한다고 한다.&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;1026&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSXC3/btsAutHtcEx/9plrQMFSYz0dkOSQwSKqkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSXC3/btsAutHtcEx/9plrQMFSYz0dkOSQwSKqkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSXC3/btsAutHtcEx/9plrQMFSYz0dkOSQwSKqkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSXC3%2FbtsAutHtcEx%2F9plrQMFSYz0dkOSQwSKqkk%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;1026&quot; height=&quot;547&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;547&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;근데 모든 방법이 단점이 있듯이, 이것도 attack 할 수 있는 방법이 있긴 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 워터마크가 들어간 모델에게 스페이스 대신 이모지를 2개 쓰라고 하면 이 모델이 생성한 텍스트는 black list 가 randomize 되는 효과?가 있다고 함. 그래서 이렇게 생성된 텍스트를 가지고 user 가 이모지를 스페이스만 갈아끼우면 이 텍스트를 가지고는 water mark 를 찾아낼 수 없음. 마찬가지로 chat gpt 한테 모든 단어의 o 를 e 로 바꿔서 써! 한다음에 내가 다시 이 텍스트를 바꿔쓰면 마찬가지로 워터마크가 드러나지 않는 텍스트임.&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;그리고 무엇보다도 이건 각 LLM 을 만드는 개발자들이 자기네 노력으로 워터마킹을 모델에 추가해야 하는 부분이라서 그들이 안 하면 방법 없음&lt;/p&gt;</description>
      <category>NLP</category>
      <category>GPTZero</category>
      <category>워터마킹</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/91</guid>
      <comments>https://gnoej671.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 17 Nov 2023 22:05:17 +0900</pubDate>
    </item>
    <item>
      <title>Framenet , Propbank, Verbnet</title>
      <link>https://gnoej671.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;차이 정리한 slides: &lt;a href=&quot;https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwim0LjlhNyBAxWfUKQEHWWMA0UQFnoECA4QAw&amp;amp;url=https%3A%2F%2Fmy.eng.utah.edu%2F~cs6961%2Fpapers%2Fsemresources-slides.pptx&amp;amp;usg=AOvVaw1R7B5NH14lduR4EHqSSEL5&amp;amp;opi=89978449&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;framenet,prombank,vernet&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 lexical database 라고 보면 될까?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;&lt;b&gt;Framenet&lt;/b&gt;: The basic idea is straightforward: that the meanings of most words can best be understood on the basis of a semantic frame: a description of a type of event, relation, or entity and the participants in it. (ref: &lt;a href=&quot;https://www.nltk.org/howto/framenet.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.nltk.org/howto/framenet.html) &lt;/a&gt;&lt;/span&gt;&lt;/blockquote&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;gt; 그래서 비슷한 frame 을 가지는 단어들을 그룹화 하고, 그 그룹의 description, 그 그룹이 가지는 relation 등을 정의해놓은 듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Arrest 라는 프레임의 경우, Frame elements 로 아래 리스트를 가짐.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;sml&quot; style=&quot;background-color: #dadada; color: #2d2d2d; text-align: start;&quot;&gt;&lt;code&gt;'Authorities',
 'Charges',
 'Co-participant',
 'Manner',
 'Means',
 'Offense',
 'Place',
 'Purpose',
 'Source_of_legal_authority',
 'Suspect',
 'Time',
 'Type'&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;&lt;b&gt;Propbank&lt;/b&gt; : predicate 이랑&amp;nbsp; arguments 들을 정리해 놓음. 장점은 very standardized (arg0, arg1.. ). Propbank 는 a set of frame files 로 이루어져 있고, 각 frame file 마다 하나 혹은 여러개의&amp;nbsp; propbank verb sense 가 정의되어 있는데 이걸 바로 frame sets 라고 한다.&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;Verbnet&lt;/b&gt;: English verb 만 annoate 한 건데, verb 마다 &lt;b&gt;agent&lt;/b&gt;, &lt;b&gt;theme&lt;/b&gt;, etc 등을 정의해 놓음. 그리고 비슷한 verb 끼리 묶어놓음.&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;FrameNet, VerbNet and PropBank. The &lt;b&gt;FrameNet&lt;/b&gt; corpus contains the examples annotated with semantic roles whereas the &lt;b&gt;VerbNet&lt;/b&gt; lexicon provides the knowledge about the &lt;b&gt;syntactic behavior of the verbs&lt;/b&gt;. We connect VerbNet and FrameNet by mapping the FrameNet frames to the VerbNet Intersetive Levin classes. The &lt;b&gt;PropBank&lt;/b&gt; corpus, which is &lt;b&gt;tightly connected to the VerbNet lexicon&lt;/b&gt;, is used to increase the verb coverage and also to test the effectiveness of our approach.&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;정리: predicate 을 정리한 lexical dataset 임. 어떻게 정리했냐? 각 predicate 마다 description 과 함께 쓰이는 elements 들로 구조화하고, 공통적인 단어들끼리 묶었다는 점에서 비슷한데, role 을 어떻게 정의했느냐 (e.g. AMR: arg0, arg1 / Verbnet: agent, theme / Frameset: 이건 frame 마다 다름), 어떤 단어들끼리 어떻게 묶었냐 이런 것들이 다른 듯.&lt;/p&gt;</description>
      <category>NLP /이것저것</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/90</guid>
      <comments>https://gnoej671.tistory.com/90#entry90comment</comments>
      <pubDate>Wed, 4 Oct 2023 18:18:22 +0900</pubDate>
    </item>
    <item>
      <title>[스크랩] batch size 는 꼭 2의 n제곱이어야 할까?</title>
      <link>https://gnoej671.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681283039798&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;Do Batch Sizes Actually Need To Be Powers of 2?&quot; data-og-description=&quot;Is the fixation on powers of 2 for efficient GPU utilization an urban myth? In this article, we explore whether this argument is true when using today's GPUs.&quot; data-og-host=&quot;wandb.ai&quot; data-og-source-url=&quot;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&quot; data-og-url=&quot;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bM95D1/hySeVslgpf/YGt9yYHKGoAmCt4zukCVAk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-To-Be-Powers-of-2---VmlldzoyMDkwNDQx&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bM95D1/hySeVslgpf/YGt9yYHKGoAmCt4zukCVAk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;Do Batch Sizes Actually Need To Be Powers of 2?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Is the fixation on powers of 2 for efficient GPU utilization an urban myth? In this article, we explore whether this argument is true when using today's GPUs.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wandb.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 여러 batchsize 를 가지고 total runtime 을 비교함. 결과적으로, 사이즈가 2의 n 제곱이든 2의 n 제곱 + 1 이든 두드러지는 차이가 있는 것도 아니고 general 하게 적용되는 최고의 batch size 도 없음.&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;결론: 자기 실험이랑 gpu 에 맞는 batchsize 를 정하면 된다.&lt;/p&gt;</description>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/85</guid>
      <comments>https://gnoej671.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 12 Apr 2023 16:12:55 +0900</pubDate>
    </item>
    <item>
      <title>[스크랩] DDP 커뮤니케이션 타입 ex. all reduce, scatter..</title>
      <link>https://gnoej671.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. ddp backend 타입 별로 사용가능한 communication strategy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pytorch.org/docs/stable/distributed.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pytorch.org/docs/stable/distributed.html&lt;/a&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;830&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UZMWO/btr9CJ2up74/MnPzQiwUsqx9xkXIF5Sa3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UZMWO/btr9CJ2up74/MnPzQiwUsqx9xkXIF5Sa3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UZMWO/btr9CJ2up74/MnPzQiwUsqx9xkXIF5Sa3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUZMWO%2Fbtr9CJ2up74%2FMnPzQiwUsqx9xkXIF5Sa3K%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;830&quot; height=&quot;921&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 각 communication strategy 설명 (그림)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pytorch.org/tutorials/intermediate/dist_tuto.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pytorch.org/tutorials/intermediate/dist_tuto.html&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X6EYt/btr9DVhhpdZ/ccKe8Sy55yjoeUuw6NPV31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X6EYt/btr9DVhhpdZ/ccKe8Sy55yjoeUuw6NPV31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X6EYt/btr9DVhhpdZ/ccKe8Sy55yjoeUuw6NPV31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX6EYt%2Fbtr9DVhhpdZ%2FccKe8Sy55yjoeUuw6NPV31%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;726&quot; height=&quot;336&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;336&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;882&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDF13/btr9GgFtwiT/MOGDo6ZK5hN0N1O6eTkad1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDF13/btr9GgFtwiT/MOGDo6ZK5hN0N1O6eTkad1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDF13/btr9GgFtwiT/MOGDo6ZK5hN0N1O6eTkad1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDF13%2Fbtr9GgFtwiT%2FMOGDo6ZK5hN0N1O6eTkad1%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;882&quot; height=&quot;910&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/84</guid>
      <comments>https://gnoej671.tistory.com/84#entry84comment</comments>
      <pubDate>Tue, 11 Apr 2023 23:15:17 +0900</pubDate>
    </item>
    <item>
      <title>Python GIL - 왜 Data parallel 이 DDP 보다 속도 향상에 도움이 되지 않을까?</title>
      <link>https://gnoej671.tistory.com/82</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://www.youtube.com/watch?v=SyIvYUgDbjA&quot;&gt;https://www.youtube.com/watch?v=SyIvYUgDbjA&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=SyIvYUgDbjA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/lECMv/hyR6SabXtl/xXqUPpJN2VKErlbTc2bzp0/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/SyIvYUgDbjA&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 기깔나게 설명해 놓았음.. 참고하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 파이썬은 One process, Multi-threads 는 안됨. 그니까 파이썬 코드 짤 때는 그렇게 짤 수 있지만 실제로 동작 방식이 그렇게 진행이 안 됨. 그게 GIL (Global Interpreter Lock) 때문임&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;gt; reference counting 으로 변수 메모리를 관리하는 파이썬 특성때문에 그럼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, Multithreads 는 하나의 process 내에서는 변수, 데이터를 공유하는&amp;nbsp; 구조임. 그래서 multi-threads 를 허용하면 thread 1 에서 이미 삭제된 변수를 thread 2 가 접근하려고 할 때 - (다시 한번 말하지만 multi thread 는 변수를 공유하는 구조하는 방식임) - &lt;b&gt;실패&lt;/b&gt;한다. 그래서 파이썬에서는 이걸 방지하기 위해서 GIL 을 씀. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 multi processing 은 서로 메모리를 공유하는 구조가 아니기 때문에 가능.&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;결론적으로 GIL 때문에 one process, multi threads 구조인 Data Parallel 은 속도 향상 효과가 별로 없을 수밖에 없음. 반대로 multi process 를 사용하는 DDP 의 경우에는 파이썬으로도 속도 향상 가능&lt;/p&gt;</description>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/82</guid>
      <comments>https://gnoej671.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 31 Mar 2023 01:36:38 +0900</pubDate>
    </item>
    <item>
      <title>accuracy 가 높아지는데 loss 도 같이 증가한다?! over-fitting 의 증거</title>
      <link>https://gnoej671.tistory.com/78</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;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675950338987&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;Why Loss and Accuracy Metrics Conflict? &amp;ndash; Jussi Huotari's Web&quot; data-og-description=&quot;A&amp;nbsp;loss function is used to optimize a machine learning algorithm. An&amp;nbsp;accuracy metric is used to measure the algorithm&amp;rsquo;s performance (accuracy) in an interpretable way. It goes against my intuition that these two sometimes conflict: loss is getting bett&quot; data-og-host=&quot;www.jussihuotari.com&quot; data-og-source-url=&quot;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&quot; data-og-url=&quot;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hkOy5/hyRxXdEYVL/c0iBcQmS3fFh7V7aCdXt60/img.png?width=664&amp;amp;height=494&amp;amp;face=0_0_664_494,https://scrap.kakaocdn.net/dn/bQNfGw/hyRzAVsR3w/C2l3WrD36rZlLr4vZonM8K/img.png?width=378&amp;amp;height=262&amp;amp;face=0_0_378_262&quot;&gt;&lt;a href=&quot;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.jussihuotari.com/2018/01/17/why-loss-and-accuracy-metrics-conflict/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hkOy5/hyRxXdEYVL/c0iBcQmS3fFh7V7aCdXt60/img.png?width=664&amp;amp;height=494&amp;amp;face=0_0_664_494,https://scrap.kakaocdn.net/dn/bQNfGw/hyRzAVsR3w/C2l3WrD36rZlLr4vZonM8K/img.png?width=378&amp;amp;height=262&amp;amp;face=0_0_378_262');&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;Why Loss and Accuracy Metrics Conflict? &amp;ndash; Jussi Huotari's Web&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A&amp;nbsp;loss function is used to optimize a machine learning algorithm. An&amp;nbsp;accuracy metric is used to measure the algorithm&amp;rsquo;s performance (accuracy) in an interpretable way. It goes against my intuition that these two sometimes conflict: loss is getting bett&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jussihuotari.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;blockquote data-ke-style=&quot;style2&quot;&gt;If the model becomes &lt;b&gt;over-confident in its predictions, a single false prediction will increase the loss unproportionally compared to the (minor) drop in accuracy.&lt;/b&gt; An over-confident model can have good accuracy but bad loss. I&amp;rsquo;d assume over-confidence equals over-fitting.&lt;/blockquote&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) overfit 된 모델에서 loss 가 높은 이유&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cross-entropy error 는 계산 방법할 때 ground truth 의 positive label 만 반영된다&lt;b&gt;&amp;nbsp; -1 * log(model prediction value)&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 참고 (&lt;a href=&quot;https://gnoej671.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gnoej671.tistory.com/26)&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Over-confident 한 모델의경우 positive한 값에만 엄청 높은값을 주고, 나머지 class 에 대해서는 엄청 낮은 값을 주게 된다. 그렇기 때문에 ground truth 랑 model prediction class 가 다를 때, 그 class 에 너무 낮은 logit / softmax 값을 줄 거기 때문에 loss 가 확 뛰게 된다 (&lt;b&gt;log0 는 infinity 값&lt;/b&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;2)&lt;b&gt; 반면 accuracy 상으로는 1개만 틀린거라&lt;/b&gt;서 그만큼 차이가 나지 않게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;그래서 over-confident 한 모델, 즉 over-fitting 된 모델의 의 경우 accuracy 와 loss 가 동시에 증가하는 양상을 보인다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Deep learning (일반)</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/78</guid>
      <comments>https://gnoej671.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 9 Feb 2023 22:45:24 +0900</pubDate>
    </item>
    <item>
      <title>Calculus on Computational Graphs: Backpropagation</title>
      <link>https://gnoej671.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://colah.github.io/posts/2015-08-Backprop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://colah.github.io/posts/2015-08-Backprop/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674736895574&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;Calculus on Computational Graphs: Backpropagation -- colah's blog&quot; data-og-description=&quot;Calculus on Computational Graphs: Backpropagation Posted on August 31, 2015 &amp;lt;!-- by colah --&amp;gt; Introduction Backpropagation is the key algorithm that makes training deep models computationally tractable. For modern neural networks, it can make training with&quot; data-og-host=&quot;colah.github.io&quot; data-og-source-url=&quot;https://colah.github.io/posts/2015-08-Backprop/&quot; data-og-url=&quot;https://colah.github.io/posts/2015-08-Backprop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nmqD2/hyRpHmGK78/E5CHMhFkHOuzjk1ckPmd80/img.png?width=1415&amp;amp;height=806&amp;amp;face=0_0_1415_806,https://scrap.kakaocdn.net/dn/cet2Lu/hyRpKRf9qM/q7NkcL6tcCjn52DLtLoWck/img.png?width=1403&amp;amp;height=811&amp;amp;face=0_0_1403_811,https://scrap.kakaocdn.net/dn/WQ60n/hyRpLvRzdn/Wum6GEPDhD5iqjALlKnmV0/img.png?width=1405&amp;amp;height=793&amp;amp;face=0_0_1405_793&quot;&gt;&lt;a href=&quot;https://colah.github.io/posts/2015-08-Backprop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://colah.github.io/posts/2015-08-Backprop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nmqD2/hyRpHmGK78/E5CHMhFkHOuzjk1ckPmd80/img.png?width=1415&amp;amp;height=806&amp;amp;face=0_0_1415_806,https://scrap.kakaocdn.net/dn/cet2Lu/hyRpKRf9qM/q7NkcL6tcCjn52DLtLoWck/img.png?width=1403&amp;amp;height=811&amp;amp;face=0_0_1403_811,https://scrap.kakaocdn.net/dn/WQ60n/hyRpLvRzdn/Wum6GEPDhD5iqjALlKnmV0/img.png?width=1405&amp;amp;height=793&amp;amp;face=0_0_1405_793');&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;Calculus on Computational Graphs: Backpropagation -- colah's blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Calculus on Computational Graphs: Backpropagation Posted on August 31, 2015 &amp;lt;!-- by colah --&amp;gt; Introduction Backpropagation is the key algorithm that makes training deep models computationally tractable. For modern neural networks, it can make training with&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;colah.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 deep learning framework 가 computational graphs 를 써서 backpropagation 을 하는데, 이 computational graphs 는 어떤 값이 들어가 있고, gradient 는 어떻게 계산되는지 상당히 잘 나와있음&lt;/p&gt;</description>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/77</guid>
      <comments>https://gnoej671.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 26 Jan 2023 21:42:44 +0900</pubDate>
    </item>
    <item>
      <title>Input normalization / Batch normalization / Layer normalization</title>
      <link>https://gnoej671.tistory.com/76</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot; data-mce-fragment=&quot;1&quot;&gt; MathJax.Hub.Config({ tex2jax: { inlineMath: [ ['$','$'], [&quot;\\(&quot;,&quot;\\)&quot;] ], processEscapes: true } }); &lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML&quot; data-mce-fragment=&quot;1&quot;&gt;&lt;/script&gt;
1. Input normalization 은 빠른 learning 을 위해 필요하다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V9jpL/btrXe8ONlo8/f2Ei3BFSBtfyHMKr6XVUl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V9jpL/btrXe8ONlo8/f2Ei3BFSBtfyHMKr6XVUl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V9jpL/btrXe8ONlo8/f2Ei3BFSBtfyHMKr6XVUl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV9jpL%2FbtrXe8ONlo8%2Ff2Ei3BFSBtfyHMKr6XVUl1%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;961&quot; height=&quot;541&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x1= 1 에서 1000 까지의 value 를 가지고 x2 = 0..1 까지의 value 를 가진다고 할 때, 그럼 마찬가지로 각각 input feature에 상응하는 weight 도 다른 scale 을 갖게 됨. 결과적으로 cost function 이 왼쪽으로 한쪽은 굉장히 좁고 (elongated) , 한쪽은 넓은 모양이 되는데 이 경우에는 learning_ratio 를 아주 작게 해서 아주 많은 steps 을 밟아야지만 최적에 이르게 된다 (위에서 왼쪽 하단 이미지 참고) . 그렇게 때문에 input normalization 해서 두 input feature 의 scale 을 조정해주면 오른쪽 하단처럼 되고 결국 input normalization =&amp;gt; fast learning 을 위해 필요한 게 되겠음.&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;그럼 normalizing 은 어떻게 하냐? 각 데이터 포인트에서 평균값을 빼고, deviation 값으로 나눠 줌&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;2. 1번과 같은 이유로 batch normalization (= normalizing activations) 이 faster learning 에 도움이 된다.&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;1272&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GBcwB/btrXgxUYu7L/J53k398jl2Fwsw7KwiC5G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GBcwB/btrXgxUYu7L/J53k398jl2Fwsw7KwiC5G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GBcwB/btrXgxUYu7L/J53k398jl2Fwsw7KwiC5G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGBcwB%2FbtrXgxUYu7L%2FJ53k398jl2Fwsw7KwiC5G0%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;1272&quot; height=&quot;699&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1번과 같은 이유로 3번째 layers 의 input 인 $a^ {[2]}$ 를 normalize 하면 $w^{[3]}$, $b^{[3]}$ 을 빨리 학습할 수 있다. 좀 더 구체적으로 말하면&amp;nbsp; activation 값이 아니라 activation 전의 값인 z (hidden unit value) 를 normalize 하는게 더 common practice 라고 함. &lt;b&gt;결국 각 layer 에서 z 값이 아니라 normalized 된 z 값을 사용하는 것이 batch normalization 임.&lt;/b&gt; 이걸 왜 &quot;batch&quot; normalization 이냐고 부르냐? 결국 normalization 값을 구하려면 mean 과 variance 를 구해야 되는데 그 평균과 편차를 batch (=mini-batch) 별로 구하기 때문.&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;3. 이미지에서는 batch normalization, NLP 에서는 layer normalization&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 normalization 값을 구하기 위해서는 mean 과 variance 값을 구해야 되는데 batch normalization 에서는 하나의 batch 에 있는 모든 elemement (words in NLP) 에 대해 구하는 거고, layer normalization 은 across feature 로 구하는 거라고 함 ( 여기서부터는 이해가 좀 안 되네) 아무튼 transformer 에서는 layer normalization 이 들어간다고 함&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;26/07/28&amp;nbsp; &amp;nbsp;좀 더 덧붙이자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(4, 3) 인풋이 있다고 하자. batch size 가 4 개고 각 예시마다 3개의 feature 로 나타낼 수 있는거임. batch normalization 을 쓸 때는 3개 중 각 하나의 feature 에 대해서 aross batch 로 normalization 하는 거고, layer normalization 은 그게 아니라 하나의 인풋 내에서 각각의 feature 를 mean, variance 을 구해서 example 내에서 normalization 하는 거임.&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;왜 layer normalization 이냐면 그 layer 에 인풋으로 들어오는 모든 값 (하나의 example) 에 대해서 normalize 하기 때문이라고?&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;1021&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Mcdp/dJMcaae9kGJ/ywz0DuKKbWr9To0DL61ktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Mcdp/dJMcaae9kGJ/ywz0DuKKbWr9To0DL61ktK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Mcdp/dJMcaae9kGJ/ywz0DuKKbWr9To0DL61ktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Mcdp%2FdJMcaae9kGJ%2Fywz0DuKKbWr9To0DL61ktK%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;622&quot; height=&quot;274&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Claude&amp;nbsp;&lt;br /&gt;&lt;br /&gt;원래 layer norm을 처음 제안한 논문(Ba, Kiros, Hinton, 2016)에서도 정확히 이 표현을 써요: &lt;b&gt;하나의 training case&lt;/b&gt;에 대해, 그 &lt;b&gt;layer로 들어오는 모든 뉴런들의 입력값 합을 가지고 평균/분산을 구한다&lt;/b&gt;고요. &quot;배치의 다른 예제들&quot;이 아니라 &quot;같은 layer 안의 다른 뉴런들&quot;이 기준이 되는 거죠.&lt;br /&gt;&lt;br /&gt;그래서 batch norm에서 &quot;batch&quot;가 통계를 낼 때 보는 대상(다른 샘플들)을 가리키듯, layer norm에서 &quot;layer&quot;도 통계를 낼 때 보는 대상(그 layer의 모든 unit)을 가리키는 이름이에요.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;</description>
      <category>NLP</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/76</guid>
      <comments>https://gnoej671.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 26 Jan 2023 21:33:06 +0900</pubDate>
    </item>
    <item>
      <title>Naive Bayes: Generative Learing Algorithm (&amp;harr; Discriminative)</title>
      <link>https://gnoej671.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt; MathJax.Hub.Config({ tex2jax: { inlineMath: [ ['$','$'], [&quot;\\(&quot;,&quot;\\)&quot;] ], processEscapes: true } }); &lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&quot;해당 포스팅은 Andew Ng 의 Machine learning class - Naive Bayes Classifier 를 요약한 것입니다.&quot;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Discriminative model vs Generative model&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discriminative model 의 대표적인 예는 Logistic regression 이라고 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$P(y|x)$ 즉 $x$ features 가 주어졌을 때 바로 $P(y)$ 를 구하는 거임. 아래 그림처럼 Binary classification 에서 두 class 를 구분하는 초록색 선을 찾는게 목표임.&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;882&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZgFGm/btrPONxcaK0/CCRfChYLv43sJ0VZnUnCpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZgFGm/btrPONxcaK0/CCRfChYLv43sJ0VZnUnCpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZgFGm/btrPONxcaK0/CCRfChYLv43sJ0VZnUnCpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZgFGm%2FbtrPONxcaK0%2FCCRfChYLv43sJ0VZnUnCpk%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;641&quot; height=&quot;425&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generative Model 로도 classifier 를 만들 수 있는데 방법이 조금 다름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 formal 하게 말하자면 Generative Model 은 $P(y|x)$&amp;nbsp; 를 직접 구하는 게 아니라 $P(x|y)P(y)$ 를 통해서 classification 을 수행함. 특히나 중요한 부분이 $P(x|y)$ 부분인데, 클래스가 주어졌을 때 x의 probabilty 를 구하도록 모델링 하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 쉽게 설명하자면, 각 클래스에 대해서 x 의 features 를 배운다고 생각하면 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBAChL/btrPOzlF26p/DYun3H3oE1kVk1PRAEm4f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBAChL/btrPOzlF26p/DYun3H3oE1kVk1PRAEm4f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBAChL/btrPOzlF26p/DYun3H3oE1kVk1PRAEm4f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBAChL%2FbtrPOzlF26p%2FDYun3H3oE1kVk1PRAEm4f0%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;661&quot; height=&quot;391&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림처럼 빨간색 원이 malignant tumor 에 대해 모델이 배운 features 라고 하고, 파란색 원이 banign tumor 에 대한 features 라고 하자. 새로운 데이터가 주어졌을 때 (원 안의 점), 이 데이터가 내가 모델링한 빨간원의 데이터와 비슷하면 malignant 파란원이랑 비슷하면 banign. 어쨌든 각 클래스에 대해서 x features 를 배우는 모델인 거임.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKG6Nw/btrPPwBsKod/HVk2aaN5i2wHV7rK4VcDj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKG6Nw/btrPPwBsKod/HVk2aaN5i2wHV7rK4VcDj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKG6Nw/btrPPwBsKod/HVk2aaN5i2wHV7rK4VcDj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKG6Nw%2FbtrPPwBsKod%2FHVk2aaN5i2wHV7rK4VcDj1%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;778&quot; height=&quot;416&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generative model 의 대표적인 예가 Naive Bayes 임.&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;둘의 차이를 좀 더 formal 하게 설명한 슬라이드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JED1U/btrPOPIpDXb/cewcZ6u6hB5L2mY0s2CQo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JED1U/btrPOPIpDXb/cewcZ6u6hB5L2mY0s2CQo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JED1U/btrPOPIpDXb/cewcZ6u6hB5L2mY0s2CQo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJED1U%2FbtrPOPIpDXb%2FcewcZ6u6hB5L2mY0s2CQo1%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;1210&quot; height=&quot;625&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Naives bayes Classification 만들기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bayes rules 에 의해서 generative model 이 배우는 $P(x|y)$ 를 가지고 classification 에 필요한 $P(y|x)$ 도출 가능함.&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;1227&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caEdpJ/btrPOlamnES/vOnxOdNj4ZBSGWWaChxuY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caEdpJ/btrPOlamnES/vOnxOdNj4ZBSGWWaChxuY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caEdpJ/btrPOlamnES/vOnxOdNj4ZBSGWWaChxuY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaEdpJ%2FbtrPOlamnES%2FvOnxOdNj4ZBSGWWaChxuY1%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;1227&quot; height=&quot;541&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;541&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;내가 헷갈렸던게 그래서 Naive Bayes 가 뭐? 이걸로 neural network 모델링을 할 수 있다는거야? 했는데 naive bayes 는 simple learning algorithm 이라고 함. 실제로 naive bayes classifier 만들 때 필요한 $P(x)$&amp;nbsp; 랑 $P(x|y)$ 를 배울 때 count 기준으로 함. 근데 Naive bayes 를 neural net 에 적용할 수는 있는데 그게 Naive Bayes Neural Net&lt;/p&gt;</description>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/71</guid>
      <comments>https://gnoej671.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 28 Oct 2022 17:20:08 +0900</pubDate>
    </item>
    <item>
      <title>Dependency parsing</title>
      <link>https://gnoej671.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt; MathJax.Hub.Config({ tex2jax: { inlineMath: [ ['$','$'], [&quot;\\(&quot;,&quot;\\)&quot;] ], processEscapes: true } }); &lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&quot;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;해당 포스팅은 Dan jurafsky 교수의 &lt;span&gt;Speech and Language Processing&lt;/span&gt; Chapter 14. Dependency Parsing 을 요약한 것이며 모든 이미지 자료로 책에서 인용한 것입니다&lt;/span&gt;&lt;/span&gt;&quot;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 포스팅 전체에서 child node 가 단 한 개의 parent node 만 갖는다고 가정한다&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Transition-based approach&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Transition-based 는 Parser (=predictor / oracle) 이 sequence of operator (left arc operator, right arc operator, shift operator, reduce operator) 를 predict 하는 방식. Each step 기준으로 보면 current step 에서 right operator를 choose 하는 classifier 라고 볼 수 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Configurations&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이 때 Predictor 는 input 으로 configurations 를 받게 되는데 configuration 이라는 건 local state + set of relations (previous predictions) 만 가지고 위의 4개의 operator 중에 하나를 선택하는 거임. (실제로는 라벨까지 있기 때문에 총 operator 수는 대략 number of&amp;nbsp; labels x operator 임). 왜 local state 란 buffer 의 top word, 그리고 stack 의 top 2 words 를 말함. 즉 buffer 와 stack 의 top tokens 만 보고 판단하기 때문에 &lt;i&gt;&lt;b&gt;local&lt;/b&gt;&lt;/i&gt; stae 라고 하는 거임. (즉 buffer 랑 stack 의 top 에 위치하지 않은 token 들을 prediction 할 때 고려하지 않음)&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;How to make training data&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Predictor / * Oracle 는 결국 input 으로는 configurations 을 받고, output 으로는 해당 configurations 이 주어졌을 때 택해야 하는 operator 를 predict 해야 함. 그렇다면 each step 에 대해서 config - operator pair 가 training data 로 있어야 된다는 뜻인데 이건 어떻게 구하냐? 이건 사실 input - complete dependency parse 만 있으면 구할 수 있음.complete dependency parse라는건 결국 set of tuples: (child, head) 라고 할 수 있음 (edge label 까지 있으면 triplet 이겠지만 simplicity 를 위해서 없다고 가정) 이 set of tuples 과 input sentence 를 reference 로 갖고 있는 상태에서 내가 가지고 있는 parser 가 이 input sentence 를 parse 한다고 simulate 하는 거임. 우선 첫 step 로는 buffer -&amp;gt; stack 으로 shift action 으로 항상 시작하니까 그렇게 하고, stack 에 있는 2개의 단어가 (child, head) 페어에 해당한다면 right arc 나 left arc 를 해야한다는 걸 알 수 있으니까 right operator 를 선택할 수 있고 그럼 현재 step 에 대해서 configs 와 operator 가 준비된거임. 이걸 반복해서 end condition 에 다를때까지 하면 문장 하나에 대한 training data 를 갖게 되는거야&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;나는 여기서 oracle 을 그냥 transition classifier 라고 이해했는데 An incremental parser for AMR (Damonte et al., 2017) 보면 Oracle은 intput sentence - ref parser 가 주어졌을 때&amp;nbsp; training data 를 return 하는 rule-based 알고리즘임. 뭐지..?&amp;nbsp; oracle 이 trainable classifier 인지 아니면 그냥 training data 를 generate 하기 위해서 쓰이는건지 모르겠음&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Feature-based / Neural classifier&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Classifier 가 각 step 에서 previous predictions (=set of relations), buffer top token, stack top 2 tokens 를 가지고 operator 를 classify 한다고 했음. 그럼&amp;nbsp; relations 랑 top tokens 를 classifer 에 input 으로 줄 때 어떻게 represent 해야할까에 대한 문제가 있음 (string 그대로 주냐? embedding 을 줄까? etc) Traditional 한 방법으로는 rule-based feature extraction 이 많이 쓰였음. 예를 들어서 stack, buffer top tokens 에 대해서는 word embedding 과 POS tag, lemmas 등을 사용해서 represent 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; 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;344&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsThBj/btrEgn4ze1b/h0jfpsxN08JCmG7vBVrVJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsThBj/btrEgn4ze1b/h0jfpsxN08JCmG7vBVrVJ1/img.png&quot; data-alt=&quot;feature-based 의 feature set (token 위치&amp;amp;amp;middot; feature 타입) ex) s1 =&amp;amp;gt; stack front token ; w = word embeeding =&amp;amp;gt; s1 &amp;amp;amp;middot; w&amp;amp;amp;nbsp; = word embedding for stack front token&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsThBj/btrEgn4ze1b/h0jfpsxN08JCmG7vBVrVJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsThBj%2FbtrEgn4ze1b%2Fh0jfpsxN08JCmG7vBVrVJ1%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;176&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;feature-based 의 feature set (token 위치&amp;amp;middot; feature 타입) ex) s1 =&amp;gt; stack front token ; w = word embeeding =&amp;gt; s1 &amp;amp;middot; w&amp;amp;nbsp; = word embedding for stack front token&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; 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;576&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzPjpm/btrEeJUmNRo/t2KL8nudIlkcl3nTdhk6zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzPjpm/btrEeJUmNRo/t2KL8nudIlkcl3nTdhk6zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzPjpm/btrEeJUmNRo/t2KL8nudIlkcl3nTdhk6zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzPjpm%2FbtrEeJUmNRo%2Ft2KL8nudIlkcl3nTdhk6zK%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;576&quot; height=&quot;351&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;2. Graph-based approach&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Graph-based 는 그냥 edge scoring system + cleanup algorithm 이라고 생각하면 됨 (위와 마찬가지로 unlabeld edge 가정할 때).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 simple 하게 모든 token 을 꼭지점으로 놔두고 ROOT node 를 또 하나의 꼭지점으로 추가한다. 그리고 나서 모든 node 를 자신의 children 과 연결함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ROOT node: 자기 자신을 제외한 모든 node 를 potential children 이라고 가정(&lt;span&gt;&amp;rarr;&lt;/span&gt; 화살표)&lt;/li&gt;
&lt;li&gt;other nodes: 자기 자신과 ROOT 를 제외한 모든 node 를 potential children 이라고 가정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 모든 node 를 서로 연결해놓은 상태에서 각 edge 를 scoring 하는 게 graph-based 방식임. 그리고 이렇게 weighted edges 를 가지고 각 node 에 대해서 best parent edge 를 선택하고 그게 valid graph 면 parsing 완성. 그게 아니라 cycle 을 포함하고 있다면&amp;nbsp; (wight scaling + cycle colapse 을 통해서) cycle 을 없애고 다시 best tree 를 선택하는 게 전체 알고리즘이다.&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;679&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BhWDK/btrEkpNaIvC/jv8zK3A25KUkhWTfXcjC2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BhWDK/btrEkpNaIvC/jv8zK3A25KUkhWTfXcjC2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BhWDK/btrEkpNaIvC/jv8zK3A25KUkhWTfXcjC2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBhWDK%2FbtrEkpNaIvC%2Fjv8zK3A25KUkhWTfXcjC2k%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;679&quot; height=&quot;553&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;A feature-based algorithm for assigning scores&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graph-based 는 인풋으로 (head node, child node) 를 받고 이 둘의 edge 에 score 를 반환하는 것이다. 이 때&amp;nbsp; transition-based 의 feature-based 와 마찬가지로 각 node 를 어떻게 represent 하게 될지가 feature-based 의 핵심. predefined features (lemma, pos tagging, word embedding, distance between the head and the dependent, etc )를 가지고 rule-based 로 하면 feautre-based graph 가 되는 거고 그게 아니라 encodings, biaffine calculration, softmax 등으로 score 를 주면 neural algorithm 인거고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;A neural algorithm for assigning scores&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코더를 통해서 each token 에 대한 embedding 을 얻고, 각 token 을 different feed forward networks 를 통과시켜서 1) token embedding as a head 2) token embedding as a dependent 를 얻는다. 예를 들어서 (w1 (head representation) , w2 (dependant representation))&amp;nbsp; 이 2개를 biaffine algorithm 에 넣어서 w1 이 w2 의 head 인 score 를 계산. 모든 edge 에 대해서 이걸 계산한 다음에 each node 의 incoming edges 에 대해서 softmax 계산 하면 해당 node 의 모든 candiate parent 에 대한 probabilty score 를 얻을 수 있음. 여기까지 하고 나면 나머지는 위랑 똑같음. each node 마다 모든 incoming edge 중 maximum socre 를 주는것만 선택한 다음에 cycle 있으면 cleanup. 결국 각 node token 을 어떻게 represent 하고 score 를 어떻게 assign 하냐에 따라 neural algorihm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqUJR/btrEiaKs2UI/r5kjSgRD7KoYKtMt07RQQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqUJR/btrEiaKs2UI/r5kjSgRD7KoYKtMt07RQQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqUJR/btrEiaKs2UI/r5kjSgRD7KoYKtMt07RQQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsqUJR%2FbtrEiaKs2UI%2Fr5kjSgRD7KoYKtMt07RQQK%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;597&quot; height=&quot;501&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;501&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;</description>
      <category>NLP /이것저것</category>
      <author>제이gnoej</author>
      <guid isPermaLink="true">https://gnoej671.tistory.com/60</guid>
      <comments>https://gnoej671.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 8 Jun 2022 18:16:46 +0900</pubDate>
    </item>
  </channel>
</rss>