<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bo-lim.log</title>
        <link>https://velog.io/</link>
        <description>나는야 호기심 많은 느림보🤖</description>
        <lastBuildDate>Fri, 17 Mar 2023 13:35:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bo-lim.log</title>
            <url>https://images.velog.io/images/bo-lim/profile/dd12a50f-7d32-416e-8693-2ae3a6b4b840/나.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bo-lim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bo-lim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[C로 컴퓨터비전 구현해보기(1)]]></title>
            <link>https://velog.io/@bo-lim/C%EB%A1%9C-%EC%BB%B4%ED%93%A8%ED%84%B0%EB%B9%84%EC%A0%84-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B01</link>
            <guid>https://velog.io/@bo-lim/C%EB%A1%9C-%EC%BB%B4%ED%93%A8%ED%84%B0%EB%B9%84%EC%A0%84-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B01</guid>
            <pubDate>Fri, 17 Mar 2023 13:35:19 GMT</pubDate>
            <description><![CDATA[<p>한동안 교환학생을 갔다온다고 블로그 업로드를 미뤘는데...
다시 시작해보려한다. 한동안은 교환가서 배운 내용들을 정리겸 올릴 계획이다. 
교환 가서 들은 수업들이 석사수업들이라 쉬운 내용이 없어 차근차근 다시 공부하며 올릴 예정이다.</p>
<p>가장 먼저는 <strong>C언어로 작성한 이미지 프로세싱 프로그램</strong>이다.</p>
<p>프랑스는
다들 리눅스를 사용하고 
학교의 모든 컴퓨터도 리눅스다.</p>
<p>심지어 과제도 <strong>리눅스로 컴파일</strong> 하도록 한다...</p>
<p>리눅스를 못하지는 않아
어려움은 없었는데
불편하긴 했다ㅎㅎㅎ</p>
<p>이참에 리눅스와 친해져왔다.</p>
<h2 id="local-filtering">Local Filtering</h2>
<p>사실 가장 먼저 한 것은
<strong>C로 PGM 파일 읽고 쓰는 것</strong>이었다.</p>
<p>하지만 이 부분은 따로 파일이 안남아있어
다음 과제들에 삽입되어있는 코드 참고하기를 부탁드린다.</p>
<p>영상에 Local filtering을 이용하여 해당 픽셀 값을 이웃 픽셀들을 고려한 값들로 대체하여 Smoothing, 즉 noise를 없애는 효과를 낼 수 있다.</p>
<p>Local Filtering에는
3가지 방법이 있다.</p>
<p>1) Averaging
2) Median Filter
3) Bilateral Filter</p>
<h3 id="averaging">Averaging</h3>
<p>말 그대로 평균값을 이용한 방법이다.</p>
<p>$$
I&#39;(i,j) = \sum_{(m,n)\in N}h(m,n)I(i-m,j-n)
$$
$$
\sum_{(m,n)\in N}h(m,n)=1
$$</p>
<p>이 방법에는
<strong>Binomial filter</strong> 방식도 포함되어있다.</p>
<p>Binomial filter는 가우시안 필터의 이산분포와 유사하며 가우시안 노이즈와 잘 맞다.</p>
<p>Binomial filter는 파스칼의 삼각형으로 coefficient values를 구할 수 있다.</p>
<p>ex)
$$
1/16 \begin{bmatrix}1&amp;2&amp;1\2&amp;4&amp;2\1&amp;2&amp;1\end{bmatrix}
$$</p>
<p><img src="https://velog.velcdn.com/images/bo-lim/post/03269e3a-5558-4ce8-b088-381c678d4ccc/image.png" alt="">출처:타이완의 Shang Shou, Communication and Multimedia</p>
<h3 id="median-filter">Median Filter</h3>
<p>위의 averaging 방식은 이미지의 노이즈도 없애지만 정보도 많이 없어진다.</p>
<p>그래서 평균을 취하지 않고 이웃 픽셀 중 최빈값으로 대체하는 방식도 있다.</p>
<h3 id="bilateral-filter">Bilateral Filter</h3>
<p>이 방식은 1998년 Tomasi와 Manduchi에 의해 소개되었다.</p>
<p>비선형 가우시안 필터를 사용하여 이전 방식들 보다 
노이즈를 제거해주면서도 엣지를 잘 유지한다.</p>
<p>비선형 가우시안 필터는 센터픽셀과의 유사성을 고려하면서 가중치를 부여하여 엣지가 더 잘 유지된다.</p>
<p><img src="https://velog.velcdn.com/images/bo-lim/post/7f14f5a1-99a5-4a0d-99a0-1e55c6c515bf/image.png" alt="">
이 이미지는 소개되었을 당시 논문에 실려있던 이미지이다.</p>
<p>$$
I&#39;(i,j) = \sum_{(m,n)\in N}h(m,n)I(i-m,j-n)
$$
$$
\sum_{(m,n)\in N}h(m,n)=1
$$
여기에
$$k,l$$ 2개의 가우시아 커널들이 사용된
bilateral filter 은 아래 식과 같이 계산된다.</p>
<p>$$
h(m,n) = \frac 1ck(\sqrt{m^2 + n^2})\space l(\sqrt{(I(i,j) - I(i-m,j-n))^2}
$$</p>
<p>$$
c = \sum_{(m,n)\in N}k(\sqrt{m^2 + n^2})\space l(\sqrt{(I(i,j) - I(i-m,j-n))^2}
$$</p>
<p>커널 $$l$$은 중심픽셀과 다른 값의 영향을 줄여준다.</p>
<p>C로 구현한 코드로 직접 얻은 결과이다. - <a href="https://github.com/bo-lim/ComputerVisionWithC">Github 링크</a></p>
<p><img src="https://velog.velcdn.com/images/bo-lim/post/cdfa112d-f91e-42b1-83e3-9c99ee1db0e8/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL(Today I Learned) - 7월 셋째 주]]></title>
            <link>https://velog.io/@bo-lim/TILToday-I-Learned-7%EC%9B%94-%EC%85%8B%EC%A7%B8-%EC%A3%BC</link>
            <guid>https://velog.io/@bo-lim/TILToday-I-Learned-7%EC%9B%94-%EC%85%8B%EC%A7%B8-%EC%A3%BC</guid>
            <pubDate>Wed, 20 Jul 2022 09:56:03 GMT</pubDate>
            <description><![CDATA[<h2 id="0719">07/19</h2>
<p>부스트캠프하면서 더 듣고 싶었던 부분인 <strong>Transformer</strong> 부분을 다시 복습하였다!
주재걸 교수님 강의는 언제 들어도 정말 좋은 것 같다.</p>
<p>밤에는 보아즈 동아리에서 하는 폰드 생성모델 후처리를 <strong>erosion, denosing</strong>을 이용하여 진행해보았다.</p>
<h2 id="0720">07/20</h2>
<p><strong>&#39;텐서플로2와 머신러닝으로 시작하는 자연어처리&#39;</strong> 책을 부스트캠프 하는 동안 샀었는데, 막상 당시에는 너무 바빠서 못 읽었다.
이제 다시 읽으려고 <strong>챕터 1, 2(~토크나이징)</strong> 를 빠르게 복습하였다.</p>
<p>밤에는 토요일에 있을 보아즈 동아리 발표를 위해 <strong>폰트 생성 코드</strong>를 다시 공부하였다.</p>
<h2 id="0722">07/22</h2>
<p>BOAZ 동아리 발표를 위해 내가 맡은 부분이 아닌 손으로 그린 것처럼 사진을 바꿔주는 그림팀의 내용을 공부하였다.</p>
<h2 id="0723">07/23</h2>
<p>BOAZ 동아리 발표.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DALL-E 논문 정리]]></title>
            <link>https://velog.io/@bo-lim/DALL-E-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@bo-lim/DALL-E-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 29 Apr 2022 02:08:57 GMT</pubDate>
            <description><![CDATA[<h1 id="dall-e">DALL-E</h1>
<h2 id="intro">Intro.</h2>
<p>이번 DALL-E 논문은 MultiModal task에 관심이 많아져서 읽고 싶었던 논문이다.</p>
<p>이미지 생성 모델답게 어려운 수식들이 있었지만 저걸 어떻게 하지?로 시작해서 어떤 아이디어로 이 모델이 학습되었구나를 알아가는 과정을 즐길 수 있었다.</p>
<p>이전에는 논문 형식을 지키면서 정리해온다는 느낌이었는데 이번에는 중요한 거 위주로 이해하기 쉽게 정리해보려고 한다.</p>
<p>paper : <a href="https://arxiv.org/pdf/2102.12092.pdf">https://arxiv.org/pdf/2102.12092.pdf</a></p>
<h2 id="dall-e란">DALL-E란?</h2>
<p><img src="https://velog.velcdn.com/images/bo-lim/post/2684f2b5-5e23-43c9-a32a-76c3ac6054fb/image.png" alt="">
DALL-E</p>
<ul>
<li>120억 개 파라미터의 autoregressive transformer 모델(GPT-3 기반의 모델)을 2억 5천만 장의 이미지-텍스트 쌍으로 학습</li>
<li>데이터셋은 인터넷에서 수집하여 학습, 결과적으로 MS-COCO 데이터셋에서 추가 정보없이 zero-shot으로도 높은 성능을 보임</li>
<li>Human Evaluation시 기존 모델보다 90% 더 높게 선호한다는 결과</li>
<li>Image-To-Image translation에서도 기본적인 수행 능력을 가지는 것을 확인 가능(Image-&gt;Text-&gt;Image)</li>
</ul>
<h2 id="2-stage-학습">2 Stage 학습</h2>
<h3 id="문제점">문제점</h3>
<p>DALL-E의 학습 목표는 텍스트와 <strong>이미지 토큰을 하나의 시퀀스로 입력받아 트랜스포머를 학습시키는 것</strong>이다.</p>
<p>이 과정에서 트랜스포머의 연산량은 시퀀스 길이의 제곱에 비례하기 때문에 이미지의 픽셀별로 입력을 넣는 것은 엄청난 자원을 소비하는 것이다.</p>
<p>이 문제점으로 인해 <strong>2Stage</strong>로 진행된다.</p>
<h3 id="전반적인-프로세스">전반적인 프로세스</h3>
<p>전체적인 학습 프로세스는 joint distribution에 대한 ELB(evidence lower bound)를 최대화 하는 과정이다.
아래와 같이 식을 분해할 수 있다.(이미지 x, 캡션 y, 토큰 z)
<img src="https://velog.velcdn.com/images/bo-lim/post/59b00405-b125-4267-9e71-e7ecd82c44f5/image.png" alt=""></p>
<p>그리고 이 모델의 lower bound는 아래와 같다.(VAE의 ELB 식과 유사)
<img src="https://velog.velcdn.com/images/bo-lim/post/f49c3071-90ff-4bec-9cdf-00eeba2baf92/image.png" alt=""></p>
<p>전반적인 진행과정은 텍스트와 이미지 토큰들이 들어가고 예측된 인덱스로 codebook에서 벡터를 꺼내 이미지 토큰에 추가시키고 이 과정이 결과 이미지를 생성할 때까지 계속 반복된다.
<img src="https://velog.velcdn.com/images/bo-lim/post/89d06ed2-5dd1-4748-8ca3-c6e99b7f2240/image.png" alt=""></p>
<p>입력부분을 구체적으로 보면 아래처럼 start-of-text 스페셜 토큰으로 시작해서 text를 넣고 남은 부분은 padding으로 채운다.
이미지 입력 전에는 start-of-image 스페셜 토큰으로 시작해 임베딩된 이미지 토큰을 입력한다.
<img src="https://velog.velcdn.com/images/bo-lim/post/073c0e87-dc0d-47c8-8c16-640eb40f21dd/image.png" alt=""></p>
<h3 id="stage-1-learning-the-visual-codebook">Stage 1: Learning the Visual Codebook</h3>
<p>첫 번째 stage에서는 256x256 RGB 이미지를 32x32의 이미지 토큰으로 압축한다.</p>
<blockquote>
<p>여기서 VQ-VAE에 대한 사전지식이 필요하다.
<img src="https://velog.velcdn.com/images/bo-lim/post/73d33365-8d0c-4fae-94f7-1caa8f891850/image.png" alt="">
VQ-VAE에서는 위와 같이 이미지 토큰으로 자른 후 K개의 벡터가 들어있는 CodeBook에서 가장 가까운 하나로 대체하여 discrete한 이미지데이터에서 VAE를 이용한 학습을 보여준다.</p>
</blockquote>
<p>DALL-E에서도 K(codebook사이즈)는 8,192로 transformer를 고정한 상태로 discrete-VAE 인코더 $q_\phi$와 디코더 $p_\theta$ 를 학습한다.
<img src="https://velog.velcdn.com/images/bo-lim/post/562185cf-8239-4aa6-b02d-acd9c7dc3000/image.png" alt="">
위의 이미지가 original image이고 아래가 discrete VAE의 결과이다.
-&gt; 디테일 손실은 보이지만 사물을 인식할 정도의 정보들은 남아있는 상태로 압축된다.</p>
<p>Discrete 데이터라서 발생하는 문제가 <strong>Back Propagation</strong>에서도 발생한다. 
위에서 CodeBook에서 가장 가까운 값을 선택할 때, argmax를 이용해 인덱스를 선택하는 방식으로 진행하면 <strong>gradient를 구할 수 없다.</strong>
-&gt; 그래서 <strong>gumble softmax relaxation</strong>을 이용하여 구해야한다. 여기서 temperature $\tau$는 0에 가까워질 수록 hard한 distribution을 만든다.
<img src="https://velog.velcdn.com/images/bo-lim/post/4e5f9a11-ae95-48ae-903b-b23bcfad40f9/image.png" alt=""></p>
<h3 id="stage-2">Stage 2</h3>
<p>두 번째 stage에서는 256의 BPE-인코딩된 텍스트 토큰과 1,024(32x32)개의 이미지 토큰들을 concat하여 연속적으로 입력한다.
이번에는 discrete-VAE 인코더 $q_\phi$와 디코더 $p_\theta$를 고정한 상태로 <strong>트랜스포머 $p_\psi$를 학습</strong>한다.</p>
<p>이 과정에서 아래와 같이 다양한 attention mask를 활용하며 모두 칸 6개는 모두 비워두어 text에 대해서는 항상 attention을 하고 이미지는 다양한 형태로 mask에 변형을 준다.
<img src="https://velog.velcdn.com/images/bo-lim/post/142f83a1-454d-41cd-9525-0086b6385412/image.png" alt=""></p>
<h2 id="결과">결과</h2>
<p><img src="https://velog.velcdn.com/images/bo-lim/post/f240b283-6d8d-4a71-9bfc-62ed724f3d26/image.png" alt="">
N을 설정하여 N개의 다양한 이미지를 생성하고 CLIP사용해 k번째로 similarity가 높은 이미지를 선택한다.</p>
<p>이미지 출처 및 내용 참고
논문-<a href="https://arxiv.org/pdf/2102.12092.pdf">https://arxiv.org/pdf/2102.12092.pdf</a>
논문해설-<a href="https://youtu.be/CQoM0r2kMvI">https://youtu.be/CQoM0r2kMvI</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[논문 속 RE Task 관련 데이터셋 이해하기 | TAC Relation Extraction Dataset | KLUE]]></title>
            <link>https://velog.io/@bo-lim/%EB%85%BC%EB%AC%B8-%EC%86%8D-RE-Task-%EA%B4%80%EB%A0%A8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-TAC-Relation-Extraction-Dataset-KLUE</link>
            <guid>https://velog.io/@bo-lim/%EB%85%BC%EB%AC%B8-%EC%86%8D-RE-Task-%EA%B4%80%EB%A0%A8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-TAC-Relation-Extraction-Dataset-KLUE</guid>
            <pubDate>Wed, 13 Apr 2022 03:34:47 GMT</pubDate>
            <description><![CDATA[<p>RE 데이터셋을 구축하기 위해 RE 관련 논문 2개를 데이터셋 구축 위주로 보았다.</p>
<h1 id="tac-relation-extraction-dataset">TAC Relation Extraction Dataset</h1>
<p>Position-aware Attention Supervised Data Improve Slot filling 논문 안에 있는 내용이다.
Slot filling 과제는 Subject 엔티티와 Object 엔티티의 relation tag를 채우는 것을 말한다.</p>
<p>이 논문의 경우는 새로운 데이터셋인 TACRED를 생성하였다. 
이전에 TAC KBP로 Knowledge base를 확장하기 위한 데이터셋이나 SemEval-2010등이 있었는데 양이 적거나 task에 적합하지 않아서 새로 만들었다고 한다.</p>
<p>TAC KBP 챌린지를 통해서 데이터를 가져왔으며 2009-2015년까지의 데이터를 사용하였으며 Mechanical Turk를 이용해서 주석을 달았다.</p>
<p>총 106,264개의 데이터들을 모았으며 2009-2012년도 까지의 데이터를 training, 2013은 dev set, 2014은 test set으로 나누었다. 2015년은 slot filling evaluation을 위해서 따로 뺐다.</p>
<p>연도별로 자르는 이 방식이 편리할 수는 있지만 엔티티 종류나 개수, 레이블등이 연도마다 불균형할 수도 있어서 좋지 않을 것 같다.</p>
<p>그래도 기존 데이터셋에 비해 10배 정도 더 많은 데이터를 갖고있다는 것이 장점이며 그리고 더 많은 relation을 갖고있어 slot filling task에 더 좋은 성능을 보여준다.
문장의 길이도 길어져 조금 더 복잡한 문장으로 task 난이도를 높였다고 볼 수 있다.</p>
<p>데이터 수집 방식으로는 </p>
<p>1) LDC example - Document에 해당 개체명이 어떻게 나와있는지 부터 태깅을 시작해서 2단계를 거쳐 완성한다. + HIT방식 (Generated example에 비해 처음부터 태깅하는 방식)
2) Generated example - 기존의 시스템을 가지고 개량을 해서 태깅하는 방식으로 진행한다.(주체, 대상이 나오는 상황에서 관계만 지정)</p>
<p>LDC example로 1만개, Generated example로 11만개를 만들고 중복을 제거하였다. 그랬더니 4천개 정도 문장이 지워졌기에 여유분을 두어 데이터 제작이 중요하다는 것을 알 수 있다.</p>
<p>작업자들의 작업 신뢰를 위해 데이터셋에 대한 질문을 제공해서 얼마나 잘 푸는지로 검증하였다. 만약 25%이상의 에러가 넘으면 재작업을 하는 방식으로 진행하였다.
데이터 작업자들의 Fleiss Kappa를 측정하고 54.4%가 나온 것을 확인하였다.</p>
<p>***KBP - Knowldege Base를 확장하기 위한 것들로 Slotfilling과 Entity Linking으로 구별된다.</p>
<h1 id="klue-re">KLUE-RE</h1>
<p>이 논문에서는 RE task를 Single sentence classification task로 보고 sub, obj로 relation triplet을 만드는 것이 목적이다.
30개의 label을 사용하고 있으며 no-relation이 빠진 micor f1 score를 계산하여 모델을 평가하였다.</p>
<p>WIKIPEDIA, WIKITREE, POLICY - 위키피디아는 온라인 백과사전과 비슷하며 위키트리는 언론사이며 폴리시는 정부정책에 대한 기사들을 모아놓은 말뭉치이다.
이렇게 구어가 아닌 문어성이 짙은 말뭉치들을 가져왔다.
그리고 social bias나 korean hate speech에 관련된 것을 필터링하였다.</p>
<p><strong>TAC-KBP를 참고하였으나 한국어의 특성상 새로운 relation들도 추가를 하였다.</strong></p>
<p>NER단계와 관계를 주석하는 2가지 단계로 진행하였으며 
첫번째 단계에서</p>
<p>1) KB-based sampling - knowledge base를 기반으로한 샘플링 방법(위키피디아, 나무위키 등으로 구축)
2) uniform sampling - no-relation 데이터도 포함하기 위해 인위로 만든 문장
2가지 접근방법을 사용하였다.</p>
<p>두번째 단계에서는
5개 중에 4개 이상의 파일럿 질문을 맞춘 163명의 사람들로 관계를 정의하는 작업을 수행했다.
추가로 작업과정에서 데이터 자체에 에러가 있는 경우나 개인정보, 비윤리적인 정보인 경우 따로 체크를 할 수 있게 하였다.</p>
<p>특징적으로 Train, Dev, Test set에서 Dev, Test set으로 갈 수록 no-relation 비율을 높였으며 5%이상의 relation인 것들도 몇가지 있었다.</p>
<h1 id="마무리">마무리</h1>
<p>논문들을 보면서 짧게나마 어떻게 데이터셋을 모았는지 알 수 있었으며,
데이터셋을 만드는 것이 막막했는데 어떤 과정을 거치는 지 알 수 있었다.
그리고 혐오표현이나 이런 것들을 필터링하는 윤리에 관한 부분도 신경 써야한다는 것도 다시 상기시킬 수 있어서 좋았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux(Ubuntu)에 Konlpy 설치 & 에러 해결하기]]></title>
            <link>https://velog.io/@bo-lim/LinuxUbuntu%EC%97%90-Konlpy-%EC%84%A4%EC%B9%98-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bo-lim/LinuxUbuntu%EC%97%90-Konlpy-%EC%84%A4%EC%B9%98-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 24 Mar 2022 04:32:51 GMT</pubDate>
            <description><![CDATA[<p>GPU 서버에 Konlpy를 설치하면서 겪었던 과정을 정리해보았다.</p>
<h2 id="konlpy-설치">Konlpy 설치</h2>
<p>우선 konlpy만 먼저 설치할 경우 JAVA HOME에 대한 에러가 난다. 그래서 이 부분 먼저 해결해줘야한다.</p>
<ul>
<li><code>apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl</code> 
(Error 1)</li>
<li><code>pip install --upgrade pip</code></li>
<li><code>pip install konlpy</code></li>
</ul>
<p>Mecab 설치</p>
<ul>
<li><code>apt-get install curl git</code> 
(Error 2)</li>
<li><code>bash &lt;(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)</code></li>
</ul>
<h2 id="error-1">Error 1</h2>
<p>첫 과정에서</p>
<blockquote>
<p>E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) 
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), <strong>is</strong> another process using it?</p>
</blockquote>
<p>이러한 에러가 날 수 있다.</p>
<p>아래 코드로 해결하였다.</p>
<h3 id="lock-걸린-파일들-지우기">lock 걸린 파일들 지우기</h3>
<p>(필요한 경우 sudo 맨 명령어 앞에 sudo 추가)</p>
<ul>
<li>rm /var/lib/apt/lists/lock </li>
<li>rm /var/cache/apt/archives/lock </li>
<li>rm /var/lib/dpkg/lock*</li>
</ul>
<h3 id="업데이트">업데이트</h3>
<ul>
<li>dpkg --configure -a </li>
<li>apt update<h2 id="error-2">Error 2</h2>
이후 다시 아래와 같은 에러가 발생할 수도 있다.<blockquote>
<p>E:Sub-process /usr/bin/dpkg returned an error code(1)</p>
</blockquote>
</li>
</ul>
<p>아래 코드로 해결하였다.</p>
<ul>
<li>rm /var/lib/dpkg/info/*</li>
<li>dpkg --configure -a</li>
<li>apt update -y</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Improving Language Understanding by Generative Pre-training | GPT-1 | 논문 정리]]></title>
            <link>https://velog.io/@bo-lim/Improving-Language-Understanding-by-Generative-Pre-training-GPT-1-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@bo-lim/Improving-Language-Understanding-by-Generative-Pre-training-GPT-1-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 20 Mar 2022 09:55:03 GMT</pubDate>
            <description><![CDATA[<h1 id="gpt-1">GPT-1</h1>
<p>최근 NLP 블로그들이나 커뮤니티에서 GPT-3에 대한 많은 언급들을 보게되었다. 우리 팀원들과 무슨 논문을 읽을까에 대한 얘기가 나왔을 때 강력 추천해서 읽게 되었다ㅎㅎㅎ</p>
<p>Author: Alec Radford, OpenAI
Reading date: March 20, 2022
Summary: GPT-1</p>
<h1 id="improving-language-understanding-by-generative-pre-training">Improving Language Understanding by Generative Pre-training</h1>
<h2 id="abstract">Abstract</h2>
<p>unlabeled 텍스트 corpus들은 많은 반면에 특정 task들에 맞는 labelded된 데이터는 희귀하다.</p>
<p>unlabeled 텍스트로 language model의 generative pre-training을 하고 </p>
<p>각 task별로 다른 fine-tuning을 하면 많은 이득이 있다.</p>
<p>이전 접근들과 다르게, fine-tuning에서 task-aware 입력 transformation을 사용하여 효과적으로 전달할 수 있다. (+ 약간의 모델구조 변형)</p>
<p>이러한 방식으로 Natural Language Understanding 분야에서 다방면으로 높은 성능을 보여준다.</p>
<h2 id="introduction">Introduction</h2>
<p>raw text를 얼마나 효과적으로 학습할 수 있는 지는 supervised learning에 대한 의존도를 완화시키는데 중요하다.</p>
<p>대부분의 딥러닝 모델은 어느정도 충분한 labeled 데이터가 필요한데 이러한 데이터는 많은 도메인에서 적용하기 힘들다. 그래서 이러한 데이터를 이용해 가치있는 representation을 만든다. 이는 확실히 성능을 높여준다.</p>
<p><strong>그러나 unlabeled text에서 단어단위를 넘는 효과를 얻기는 힘들다.</strong></p>
<ol>
<li>각기 다른 task마다 다양한 objectives를 가지기 때문에 효과적인 transfer를 위한 text representation을 최적화하려는 목표가 명확하지 않기 때문이다.</li>
<li>학습된 representation을 transfer하는 가장 효과적인 방법이 task마다 달라서 일치하지 않는다.</li>
</ol>
<ul>
<li><p><strong>목표 : 다양한 task에 transfer 가능한 보편적인 representation을 학습</strong></p>
<ul>
<li><p>논문에서는 semi-supervised 접근을 보여준다 → (unsupervised pre-training + supervised fine-tuning)</p>
</li>
<li><p>unlabeled text + target task에 맞는 몇몇 datasets ( unlabeled corpus와 같은 도메인이라면 target task의 dataset 필요없음)</p>
</li>
<li><p><em>2-stage의 학습과정이 있다.*</em></p>
</li>
</ul>
<ol>
<li>unlabeled 데이터로 파라미터 초기화를 학습</li>
<li>target task의 supervised objective에 맞게 파라미터 학습</li>
</ol>
</li>
</ul>
<p>모델 안에서 <strong>Transformer를 사용한다.</strong></p>
<ul>
<li>구조적인 메모리로 long-term dependencies를 효과적으로 다루기 위해 사용한다. rnn계열 모델에 비해 다양한 task에 대해 robust한 결과를 얻는다.</li>
</ul>
<p>본 모델은 </p>
<ul>
<li>natural language inference</li>
<li>question answering</li>
<li>semantic similarity</li>
<li>text classification</li>
</ul>
<p>이 4가지 타입의 NLU task를 평가하였다.</p>
<p>당시 12 task 중 9개에 SOTA를 달성하였다.</p>
<h2 id="related-work">Related Work</h2>
<h3 id="semi-supervised-learning-for-nlp">Semi-supervised learning for NLP</h3>
<p>본 논문의 모델은 semi-supervised learning에 속하며 이 분야는 sequence labeling이나 text classification과 같은 task에 잘 적용된다.</p>
<p>가장 먼저 supervised 모델 안에서 unlabeled data의 word-level 또는 phrase-level에 대해 연구하였다. </p>
<p>몇 년 후, 워드 임베딩의 이점들로 다양한 task의 성능이 올라갔다.</p>
<p>저자는 단어 이상의 전달을 하고자 했다. 당시 최근 연구들도 unlabeled 데이터에서 Phrase-level, sentence-level에 대한 연구가 되고 있었다.</p>
<h3 id="unsupervised-pre-training">Unsupervised pre-training</h3>
<p>컴퓨터 비전 연구부터 pre-training에 대한 대한 연구를 보여줬었다. NLP분야에서도 언어적인 정보를 잡아내는 데 도움이 되는 pre-training LSTM 모델을 보여주었으나 RNN 계열 모델이기에 비교적 짧은 범위에서만 가능했다.</p>
<p>그래서 본 논문의 모델은 transformer를 선택하여 긴 범위에도 가능하게 하였으며, 뿐만 아니라 다양한 task도 가능하게 하였다.</p>
<h3 id="auxiliary-training-objectives">Auxiliary training objectives</h3>
<p>보조적인 unsupervised training objectives를 더하는 것은 semi-supervised learning의 변형 중 하나이다.</p>
<p>이전 연구에서 POS tagging과 같은 보조적인 language 모델링 objective를 추가하여 sequence labeling에서 성능 향상을 보여줬다. </p>
<p>본 논문의 모델도 보조적인 objective를 추가하는데, unsupervised pre-training은 이미 target task와 연관된 언어적 특성을 학습한다.</p>
<h2 id="framework">Framework</h2>
<p>2-stage로 학습과정이 구성된다.</p>
<ol>
<li>Unsupervised pre-training</li>
<li>Supervised fine-tuning</li>
</ol>
<h3 id="unsupervised-pre-training-1">Unsupervised pre-training</h3>
<p>unlabeled된 많은 corpus를 가진 Text로 높은 수용력을 가진 모델을 학습하는 과정이다.</p>
<p>$L_1(U) = \sum_{i}logP(u_i|u_{i-k},\cdots,u_{i-1};\Theta)$ → likelihood를 maximize하기 위한 modeling objective</p>
<p>U = {u_1,...,u_n} : unsipervised corpus of tokens ( unlabeled 데이터 ) </p>
<p>k : window size,  P : conditional probability(파라미터 $\Theta$에 의해 만들어진다.)</p>
<p>→ 이 식은 이전 토큰들을</p>
<p>파라미터들은 <strong>확률적 경사하강법</strong>으로 학습된다.</p>
<ul>
<li>transformer를 변형한 <strong>multi-layer Transformer decoder</strong>를 사용한다.</li>
<li>multi-headed self-attention 을 적용하였다.</li>
<li>$h_0 = UW_e + W_p$</li>
<li>$h_l = transformer_block(h_{l-1})\forall i \in [1,n]$</li>
<li>$P(u) = softmax(h_nW_e^T)$<ul>
<li>U = (u_-k, ..., u_-1) : context vector of tokens,</li>
<li>n : 레이어 개수,</li>
<li>W_e : 토큰 임베딩 matirx,</li>
<li>W_p : position 임베딩 matrix</li>
</ul>
</li>
</ul>
<h3 id="supervised-fine-tuning">Supervised fine-tuning</h3>
<p>실제 target task에 맞게 labeled 데이터를 가지고 fine-tuning하는 과정이다.</p>
<ul>
<li>$P(y|x^1,...,x^m) = softmax(h_l^mW_y)$</li>
<li>$L_2(C) = \sum_{(x,y)} log P(y|x^1, ..., x^m)$ → maximize하는 objective</li>
<li>C : labeled 데이터, $h_l^m$ : 마지막 transformer 블럭을 얻기위해 pre-trained 모델을 지나온 이 과정에서의 입력 데이터, W_y : 추가된 output 레이어의 파라미터</li>
</ul>
<p>위의 2개의 objective를 아래 식으로 하나로 합친다.</p>
<p>$L_3(C) = L_2(C) + \lambda * L_1(C)$</p>
<p>fine-tuning동안 추가되는 파라미터는 W_y와 토큰 구분을 위한 임베딩에서 뿐이다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/1fcde216-c6ea-4df6-b5f8-b5564eef870f/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-20_%EC%98%A4%ED%9B%84_4.23.25.png" alt=""></p>
<h3 id="task-specific-input-transformations">Task-specific input transformations</h3>
<p>text 분류 task 같은 경우에는 앞 뒤에 start와 end token만 붙여 넣어주면 된다.</p>
<p>반면에 다른 task같은 경우에는 변형을 주고 넣어야 된다.</p>
<p>이전 연구에서는 task specific한 구조에 맞춰 넘겼기에 상관없지만 본 논문 모델에서는 pre-training 과정에서는 task를 고려하지 않기에 변형을 주어야한다.</p>
<p>structed input → ordered sequence로 pre-trained 모델이 바꿔준다. 이러한 변형으로 나중에 task에 맞게 fine-tuning하는 과정에서 많은 변화를 주지 않아도 된다.</p>
<h2 id="experiments">Experiments</h2>
<h3 id="setup">Setup</h3>
<ul>
<li><p>Unsupervised pre-training</p>
<ul>
<li><p>BookCorpus dataset 이용</p>
</li>
<li><p>어드벤처, 판타지 로맨스를 포함한 다양한 장르의 7000 서로 다른 출판되지 않은 책이 있는 데이터 셋 → long-range 구조</p>
</li>
<li><p>1B Word Benchmark</p>
</li>
<li><p>대략 같은 사이즈지만 문장단위로 섞여있다. → long-range 구조 파괴</p>
</li>
<li><p>이 corpus에 대해 매우 낮은 perplexity ( 18.4 )</p>
</li>
</ul>
</li>
<li><p>Model specifications</p>
<ul>
<li>position-wise feed-forward 네트워크에서 3072차원의 inner states</li>
<li>Adam optimizer ( max lr : 2.5e-4, 2000 iter까지는 선형적으로 0부터 증가하다가 consine 스케줄러로 0까지 그래프를 따라 바뀐다. )</li>
<li>64 mini-batch로 랜덤하게 샘플링하여 100 epoch 학습</li>
<li>Layernorm에서는 가중치 초기화 N(0,0.2)</li>
<li>40000dml BPE vocabulary</li>
<li>드롭아웃 0.1</li>
<li>변형된 L2 regulariation</li>
<li>Gaussian Error Linear Unit(GELU) - activation function</li>
</ul>
</li>
<li><p>Fine-tuning</p>
<ul>
<li>unsupervised learing의 하이퍼 파라미터 재사용</li>
<li>classifier의 드롭아웃 0.1</li>
<li>3 epoch정도 학습</li>
<li>배치사이즈 32, lr : 6.25e-5</li>
<li>learning rate decay 스케줄 ( warmup 0.2%, lambda : 0.5 )</li>
</ul>
</li>
</ul>
<h3 id="supervised-fine-tuning-1">Supervised fine-tuning</h3>
<p><img src="https://images.velog.io/images/bo-lim/post/bbc52d27-5fae-4f69-9b15-23d75b4d545e/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-20_%EC%98%A4%ED%9B%84_5.35.15.png" alt=""></p>
<p><img src="https://images.velog.io/images/bo-lim/post/5401e21c-f1f9-48a8-b745-248136e5ef2f/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-20_%EC%98%A4%ED%9B%84_5.41.01.png" alt=""></p>
<ul>
<li>NLI, QA &amp; commonsense reasoning, Semantic Similarity, Classification 많은 dataset에서 SOTA 달성</li>
</ul>
<h2 id="analysis">Analysis</h2>
<p><img src="https://images.velog.io/images/bo-lim/post/e785540b-9f4b-46db-9655-76be71163c66/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-20_%EC%98%A4%ED%9B%84_5.53.56.png" alt=""></p>
<ul>
<li><p>transfer할 때의 layer 개수에 따른 성능을 그래프로 보여준다.</p>
<p>  → 층의 개수가 많아질수록  성능이 좋아지는 것을 볼 수 있다.</p>
<p>  → update를 많이 할 수록 전체적으로 성능이 좋아지는 것을 볼 수 있다. ( 다양한 NLP task를 위한 다양한 특성 학습 )</p>
</li>
</ul>
<h3 id="ablation-studies">Ablation studies</h3>
<p><img src="https://images.velog.io/images/bo-lim/post/09eb614e-2b31-4edb-8f01-41c06ab7f310/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-20_%EC%98%A4%ED%9B%84_6.02.56.png" alt=""></p>
<p>3가지 다른 연구 진행</p>
<ul>
<li>w/o 보조적인 LM<ul>
<li>보조적인 objective는 NLI task와 QQP에 도움을 준다.</li>
<li>큰 데이터셋에 좋다.</li>
</ul>
</li>
<li>LSTM과 Transformer 비교<ul>
<li>LSTM에서 평균 5.6의 성능이 더 떨어진다.</li>
<li>pre-training하지 않았을 때도 비교해 보았을 때, 논문의 모델 성능이 더 좋았다.</li>
</ul>
</li>
</ul>
<h2 id="마무리">마무리</h2>
<p><em>내가 이번 논문으로 Transformer의 대단함과 비교적 NLP에서 더 Input transformation처럼 실제 학습이 진행되기 전까지의 전처리 과정이 중요한 것 같다는 생각이 들었다.</em></p>
<p><em>생각보다 모델 안의 구조가 단순해서 놀랐으며 마지막 output layer를 조금 더 복잡한 형태나 task specific하게 바꾸면 성능이 더 오를 수도 있지 않을까....?하는 작은 의문이 들었다.</em></p>
<p><em>이후 GPT-2,3도 읽을 예정인데, 앞으로 어떠한 단점을 가지고 변화하였을 지 궁금하다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GPT-1 간단하게 알아보기]]></title>
            <link>https://velog.io/@bo-lim/GPT-1-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bo-lim/GPT-1-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 16 Mar 2022 02:58:02 GMT</pubDate>
            <description><![CDATA[<h1 id="gpt-1">GPT-1</h1>
<p>Open AI에서 개발한 모델로 다양한 자연어처리 task를 처리할 수 있는 통합된 모델이 중요한 특징이다.</p>
<h2 id="모델-구조와-학습-방식">모델 구조와 학습 방식</h2>
<p><img src="https://images.velog.io/images/bo-lim/post/ac89a0da-abc3-4595-9538-d47985c18ab9/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-16%20%EC%98%A4%EC%A0%84%2011.34.18.png" alt=""></p>
<ul>
<li>우선 Text를 position 임베딩을 더한다.</li>
<li>self-attention 블럭을 12개 쌓는다.</li>
<li>Text Prediction : 첫 단어부터 다음 단어까지 순차적으로 예측하는 모델이다.</li>
<li>동시에 모델의 큰 변형없이 classification도 수행하기 위해 Text Classifier에 Extract 벡터를 최종 output layer에 전달하도록 한다.</li>
<li>Classification이 외에 Entailment, Similarity, Multiple Choice와 같이 다른 task에도 사용가능하다.</li>
</ul>
<p><strong>다른 task의 transfer learning에 활용하고 싶다면</strong></p>
<ul>
<li>output layer인 Linear를 떼어낸다.</li>
<li>Transformer output인 워드별 인코딩 벡터를 이용하여 추가적인 하나의 레이터를 더 붙인 후 전체 레이어를 학습한다.</li>
<li>마지막 레이어는 random initialization이 되는 반면에 이전 레이어들은 학습이 되어있기 때문에 이전 레이어들은 많이 변하지 않으면서 마지막 레이어는 충분히 학습이 되도록 training한다.</li>
</ul>
<p>다음 단어 예측하는 방향으로 학습된 모델을 문서분류에 활용하기에는 서로 다르다.
이러한 차이를 대규모 데이터를 가지고 self-supervised learning을 하여 이를 활용하는 방향으로 처리한다.</p>
<p>해당 task만을 위해 customized된 정확도 보다 더 높은 성능을 보여주는 것을 확인할 수 있다.<img src="https://images.velog.io/images/bo-lim/post/60873810-6f33-4a90-8488-99dd893c2308/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-16%20%EC%98%A4%EC%A0%84%2011.56.57.png" alt=""></p>
<p>팀원들끼리 다음 논문 발표을 GPT로 정했기 때문에 간단하게 알아간다는 느낌으로 정리해보았다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding | 논문 정리]]></title>
            <link>https://velog.io/@bo-lim/BERTPre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding</link>
            <guid>https://velog.io/@bo-lim/BERTPre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding</guid>
            <pubDate>Mon, 14 Mar 2022 07:22:29 GMT</pubDate>
            <description><![CDATA[<h1 id="bertpre-training-of-deep-bidirectional-transformers-for-language-understanding">BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding</h1>
<p>Author: Google AI Language, Jacob Devlin
Link: <a href="https://arxiv.org/pdf/1810.04805.pdf">https://arxiv.org/pdf/1810.04805.pdf</a>
Reading date: March 13, 2022
Type: Paper</p>
<h2 id="abstract">Abstract</h2>
<p>BERT - Bidirectional Encoder Representations from Transformers</p>
<p>목적 : 레이블링 되지 않은 텍스트를 모든 레이어에서 오른쪽, 왼쪽 문맥 모두 같이 고려하면서 deep bidirectional representations을 pretrain 하는 것이다.</p>
<p>이렇게 pretrained BERT모델로 output layer를 붙여 다양한 task에서 높은 성능을 보인다.</p>
<h2 id="introduction">Introduction</h2>
<p>하위 task에 pre-trained language representations를 적용하기 위한 2가지 방법이 있다.</p>
<ol>
<li><p>feature-based</p>
<p> 특정 task를 위한 모델 구좌에 추가적인 feature를 붙이는 것이다.</p>
<p> ex) ELMo</p>
</li>
<li><p>fine-tuning</p>
<p> pre-trained된 파라미터들을 fine-tuning하는 것이다.</p>
<p> ex) Generative Pre-trained Transformer(OpenAI GPT)</p>
</li>
</ol>
<p>이런 방식들은 pre-training할 때, 동일한 objective function을 가지는 unidirectional language models를 사용한다.</p>
<p>→ 한계 : 일반적인 language 모델은 unidirectional(n-gram 방식), 아키텍처 선택에 제한을 준다.</p>
<p>이러한 규제는 문장단위 task에 최적이 아니며, 양방향으로 문맥 통합하는 것이 중요한 QA와 같이 토큰단위 task들에 fine-tuning 할 때, 안좋은 영향을 준다.</p>
<p>논문에서 BERT는 MLM(Masked Language Model)로 unidirectionality 규제를 완화한다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/bbe675f6-b51f-44aa-b1c0-0038749029c6/Untitled.png" alt=""></p>
<h3 id="mlm">MLM</h3>
<p>입력 데이터에서 랜덤하게 몇몇 토큰을 가리고, 가려진 토큰의 id를 예측한다.</p>
<p>이 방식은 전체적인 문맥을 파악하도록 도와준다.</p>
<h3 id="next-sentence-prediction">next sentence prediction</h3>
<p>문장들이 서로 이어지는 지를 pre-train한다.</p>
<ul>
<li><p>BERT의 contributions</p>
<ul>
<li><p>랜덤하게 토큰들을 mask하여 pre-trained deep bidirectional representations를 가능하게 했다.(문맥 파악)</p>
</li>
<li><p>pre-trained representations가 task별로 아키텍처가 매우 세분화되는 것을 줄여주었다.</p>
<p>  당시 문장단위와 토큰단위에 SOTA를 달성한 첫번째 fine-tuning based reprsentation 모델이었다.</p>
</li>
<li><p>11개의 NLP task에 SOTA를 달성했었다.</p>
</li>
</ul>
</li>
</ul>
<h2 id="related-work">Related Work</h2>
<ul>
<li>일반적인 pre-training language representation에 대한 긴 역사</li>
</ul>
<h3 id="unsupervised-feature-based-approaches">Unsupervised Feature-based Approaches</h3>
<p>word embedding을 pre-train 하기 위해서, left-to-right language 모델링 기법들이 사용되었다.</p>
<p>이러한 방식은 문장 임베딩 같이 더 굵직하거나 paragrah 임베딩으로 일반화되간다.</p>
<p>ELMo와 그 이전 방법들은  left-to-right으로 문맥에 대한 피처들과 right-to-left language모델을 추출한다.</p>
<p>left-to-right과 right-to-left representation을 연결하여 각 토큰의 contextual representation을 만든다.</p>
<p>그렇지만 deep한 bidirectional은 아니다.</p>
<h3 id="unsupervised-fine-tuning-approaches">Unsupervised Fine-tuning Approaches</h3>
<p>contextual token representation을 생성하는 인코더들을 레이블링 되지 않은 텍스트로 pre-train하고 fine-tuning하는 방법이다.</p>
<p>이 방법의 장점은 파라미터 수가 적다는 것이다. </p>
<p>이 예시로 OpenAI GPT가 있다.</p>
<h3 id="transfer-learning-from-supervised-data">Transfer Learning from Supervised Data</h3>
<p>큰 데이터셋의 supervised task에서는 효과적인 transfer를 보여줬다.</p>
<p>컴퓨터 비전 연구에서도 큰 pre-trained 모델들에서 transfer learning의 중요성을 보였다.</p>
<p>→ImageNet으로 pre-train된 모델을 fine-tuning</p>
<h2 id="bert">BERT</h2>
<ul>
<li>2가지 스텝으로 구성<ol>
<li>pre-training<ol>
<li>레이블링이 안된 pre-training task와 다른 데이터로 학습</li>
</ol>
</li>
<li>fine-tuning<ol>
<li>pre-trainined 모델의 파라미터를 초기값으로 가진다.</li>
<li>레이블링된 데이터를 가지고 fine-tuning을 진행한다.</li>
</ol>
</li>
</ol>
</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/bbbb39ca-aa8a-41ee-9877-bb397d0fac22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-13_%EC%98%A4%ED%9B%84_6.25.19.png" alt=""></p>
<p>→ 서로 다른 하위 task에 사용할 때도 같은 pre-trained 파라미터를 사용한다.</p>
<h3 id="model-architecture">Model Architecture</h3>
<p>BERT의 모델 구조는 multi-layer bidirectional Transformer 인코더이다.</p>
<p>L : layer 수</p>
<p>H : hidden 사이즈</p>
<p>A : self-attention head 수</p>
<p>로 아래 수식에서 표현한다.</p>
<p>$BERT_{BASE} (L=12, H=768, A=12, Total Parameters=110M)$</p>
<p>$BERT_{LARGE} (L=24, H=1024, A=16, Total Parameters=340M)$</p>
<p>base 경우는 OpenAI GPT 모델과 모델 사이즈가 같다.</p>
<p>그러나, constrained self-attention을 사용과 bidirectional self-attention 사용의 차이를 가진다.</p>
<h3 id="inputoutput-representations">Input/Output Representations</h3>
<ul>
<li><p>3만개의 토큰 vocabulary를 가진 WordPiece 임베딩 사용하였다.</p>
</li>
<li><p>문장 제일 앞에는 [CLS] 토큰이다.</p>
<p>  CLS는 special classification token으로 final hidden vector에서(그림1에서 C) token sequence의 결합된 의미를 가지고, 간단한 classifier를 붙여 분류문제를 해결할 수 있다. 만약 분류문제가 아니라면 이 토큰을 무시하면 된다.</p>
</li>
<li><p>하나의 sequence 안에는 문장 쌍들이 있다.</p>
<p>  이 문장들을 구별하기 위해 [SEP]-special token과 어느 문장에 속하는지 알려주는 임베딩을 한다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/26b31cc6-a77a-490f-a39a-fc529b0a9093/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-13_%EC%98%A4%ED%9B%84_10.00.16.png" alt=""></p>
<ul>
<li>그림2처럼 Input represnetation은 상응하는 토큰과 segment와 position 임베딩을 합해서 구한다.</li>
</ul>
<h3 id="pre-training-bert">Pre-training BERT</h3>
<p>기존 모델들과 다르게 2가지의 unsupervised task를 이용한다.</p>
<ol>
<li><p>Masked LM</p>
<p> deep bidirectional representation을 위해 랜덤하게 몇몇 input 토큰들을 가리고 이를 예측한다. → “masked LM(MLM)”</p>
<p> [MASK] 토큰을 예측했던 pre-train과 달리 fine-tuning은 [MASK]토큰이 없다. 그래서 항상 masked 토큰을 실제 [MASK]토큰으로 대체하지 않는다.</p>
<p> 논문에서는 전체 input token 포지션의 15%를 랜덤하게 고르고 </p>
<p> 이 중 80%만 [MASK]토큰으로 바꾼다. </p>
<p> 나머지 10%는 랜덤한 토큰으로 바꾸고</p>
<p> 나머지 10%는 바꾸지 않는다.</p>
<p>-&gt; 이 부분을 MASK상의 DropOut이라고 혼자 이해했다...ㅎㅎ</p>
<p> cross-entropy loss로 원래 토큰과 비교한다.</p>
</li>
<li><p>Next Sentence Prediction (NSP)</p>
<p> 많은 중요한 task들은 문장들간의 relationship의 이해를 기반으로 둔다.</p>
<p> 그래서 BERT에서는 이를 두 문장이 연결되어있는지 아닌지를 예측한다. </p>
<p> 실제로 문장B의 50%는 문장A 다음 나오는 문장들이고 → IsNext로 레이블링 된다.</p>
<p> 나머지 50%는 랜덤한 문장이다. → NotNext로 레이블링 된다.</p>
<p> 이는 QA나 NLI에서 특히 높은 성능을 보여준다.</p>
</li>
</ol>
<h4 id="pre-training-data">Pre-training data</h4>
<ul>
<li>BookCorpus ( 800M words)</li>
<li>English Wikipedia (2,500M words)</li>
</ul>
<h3 id="fine-tuning-bert">Fine-tuning BERT</h3>
<p>트랜스포머의 self-attention으로 인해 BERT가 많은 하위 task들에 적용할 수 있기 때문에 Fine-tuning이 간단하다.</p>
<p>간단하게 input과 output 데이터들을 BERT에 잘 맞추고 end-to-end로 모델을 fine-tune한다.</p>
<p>입력 데이터에서 pretraining에 사용한 문장 A - B 관계는 아래와 비슷하다.</p>
<ul>
<li>패러프래이징 문장 쌍</li>
<li>가설 - 전제</li>
<li>질문 - 지문</li>
<li>생성 - 없음</li>
</ul>
<p>아웃풋에서는 token representation은 output layer에 시퀀스 tagging이나 QA처럼 토큰단위 task를 위해 제공된다. [CLS]는 분류문제일때 제공된다.</p>
<p>pre-training에 비해 fine-tuning은 덜 비싸다.</p>
<h2 id="experiments">Experiments</h2>
<p>논문에서는 BERT를 11개의 NLP task에 fine-tuning했다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/55165e16-779d-4cd0-8010-b05cf4b17cfe/Untitled%201.png" alt=""></p>
<h3 id="glue">GLUE</h3>
<p>GLUE </p>
<ul>
<li>The General language Understanding Evaluation benchmark</li>
<li>다양한 자연어 understanding task들의 모음</li>
</ul>
<p>일반적인 분류 문제에서 C : 마지막 히든 벡터, W : 분류 레이어 가중치들</p>
<ul>
<li>$log(softmax(CW^T))$</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/82d88ac7-8ada-4d92-b367-b931cdfd08ce/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-14_%EC%98%A4%EC%A0%84_12.44.52.png" alt=""></p>
<ul>
<li>매우 적은 학습 데이터에서 BERT_LARGE가 BERT_BASE를 크게 능가한다.</li>
</ul>
<h3 id="squad-v11">SQuAD v1.1</h3>
<p>Question Answering 쌍 100k개로 이뤄져있다.</p>
<p>GLUE와 달리 질문과 지문이 주어지고 정답을 맞추는 것이다.</p>
<p>질문 → A 임베딩, 지문 → B 임베딩</p>
<p>S : start 벡터, E : end 벡터를 나타내고</p>
<p>word i의 probability는 해당 토큰과 S의 dot product 연산 이후, softmax를 통해 구해진다.</p>
<p>$P_i = \frac{e^{S\cdot T_i}}{\sum_j e^{S\cdot T_i}}$</p>
<p>Answer span의 끝부분에서도 유사한 공식이 사용된다.</p>
<p>후보 span의 스코어는 $S\cdot T_i + E \cdot T_j$ 로 구한다.</p>
<p>에측할 때는 $(j\leq i)$범위만 가능하다.</p>
<h3 id="squad-v20">SQuAD v2.0</h3>
<p>v1.1에 비해 더 현실적으로 answer가 짧지 않도록 변경하였다.</p>
<p>예측시 비교를 위해 </p>
<p>no-answer span 스코어와 best non-null span을 비교한다.</p>
<p>→ $s_{null} = S\cdot C + E\cdot C$, $s_{\hat i, j} = max_{j\leq}S\cdot T_i + E\cdot T_j$</p>
<p>여기서 $s_{\hat i, j} &gt; s_{null}+\tau$ 이면 non-null answer로 예측한다.</p>
<h3 id="swag">SWAG</h3>
<p>SWAG - The Situations With Adversarial Generations dataset으로 113k 문장쌍으로 이루어져 있고</p>
<p><strong>grounded common-sense inference</strong>를 평가하기 위해 사용한다. 4가지 선택 중 가장 그럴 듯한 하나를 고른다.</p>
<p>SWAG 데이터셋으로 fine-tuning할 때는, </p>
<p>input 문장들을 4개로 구성하고 </p>
<p>주어진 문장의 concat → 문장 A,</p>
<p>가능한 연결 → 문장 B</p>
<p>task specific한 V를 학습시키고, [CLS]토큰을 표현한 C를 dot product, softmax 연산을 진행한다.</p>
<h2 id="ablation-studies">Ablation Studies</h2>
<h3 id="effect-of-pre-training-tasks">Effect of Pre-training Tasks</h3>
<ul>
<li>No NSP : MLM을 이용한 bidirectional 모델, 그러나 NSP가 없다.</li>
<li>LTR &amp; No NSP : LTR(Left-to-Right) LM을 사용하고, NSP가 없다.</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/dfac4711-8ffc-46c2-9478-fc1c739ab5e2/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-14_%EC%98%A4%EC%A0%84_1.46.34.png" alt=""></p>
<p>→ LTR보다는 MLM이 좋고, NSP없는 것보다 있는 것이 좋다.</p>
<p>추가로 LTR + RTL을 연결하여 표현하면 2배로 비용이 비싸지고, QA와 같은 task에서 직관적이지 않다. 그리고 덜 강력하다.</p>
<h3 id="effect-of-model-size">Effect of Model Size</h3>
<p>BERT모델의 레이어 수, hidden units, attention heads를 다르게 하여 모델 사이즈를 조절하여 실험하였다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/b3632865-46e9-40e9-8638-33733635dadf/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-14_%EC%98%A4%EC%A0%84_1.54.36.png" alt=""></p>
<p>→ 모델이 커질수록 정확도도 증가하였다.</p>
<p>하위 task를 위한 dataset이 작아도 pre-training 을 해줬기 때문에 모델 크기가 클수록 정확도도 좋았다.</p>
<h3 id="feature-based-approach-with-bert">Feature-based Approach with BERT</h3>
<p>BERT는 fine-tuning 방법이었지만 ELMo와 같이 feature-based 방법도 사용할 수 있다.</p>
<p>장점</p>
<ol>
<li>트랜스포머 인코더는 모든 NLP task에 적용할 수 없기 때문에, network를 붙여 사용할 수 있다.</li>
<li>미리 학습 데이터에 대한 비싼 representation을 먼저 계산하고 더 저렴한 모델로 많은 실험을 진행할 수 있다는 부분에서 Computational 이점을 가질 수 있다.</li>
</ol>
<p><img src="https://images.velog.io/images/bo-lim/post/004d7a09-b177-48a1-ba97-dfc27241659a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-14_%EC%98%A4%EC%A0%84_2.04.36.png" alt=""></p>
<p>→ fine-tuning없이 activations를 추출하고 마지막 레이어에 Bi-LSTM을 붙여서 해당 레이어만 학습을 진행하여 비교하였다. 결과 Four Hidden이 높게 나왔다.</p>
<h2 id="마무리">마무리</h2>
<p><em>많은 task에서 높은 성능을 보여줘서 매우 놀랐다. 내가 느끼기로는 주로 내용의 이해가 필요한 부분 위주로 잘 된다고 생각하고 문장 생성이나 다른 NLP task에서의 성능은 잘 모르겠다...
엄청 복잡한 것보다 간단한 아이디어로 성능이 높이는 것이 더욱 의미있고 가치있는 아이디어라고 생각하는데, BERT가 MLM과 NSP로 NLP에 많은 의미를 가져온 것 같다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BLEU Score 알아보기]]></title>
            <link>https://velog.io/@bo-lim/BLEU-Score-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bo-lim/BLEU-Score-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 14 Mar 2022 06:40:27 GMT</pubDate>
            <description><![CDATA[<h1 id="bleu-score">BLEU Score</h1>
<p>NLP 논문을 읽다보면 정말 자주 나오는 것 같다.</p>
<p>우선 precision과 recall을 먼저 알고 넘어가야한다.</p>
<h2 id="precision--recall">Precision &amp; Recall</h2>
<p>이미지 분류 모델처럼 cross-entropy loss와 같이 일반적인 loss 방법들을 사용하면 NLP에서 맞지 않을 수 있다.</p>
<p>가령 문장 생성 task에서 한 문장이나 단어를 빼먹거나 문장을 더 많이 생성한다면 현재 상황을 제대로 반영하지 못한다.</p>
<p>예를 들어 I love you -&gt; Oh I love you로 예측했다고 하면, 결론적으로 이 모델은 하나도 맞추지 못한 것이다. 하지만 이 경우는 Oh를 제외하기만 하면 모두 맞는 모델인데 기존 평가방법들은 이러한 정보를 반영하지 못한다.</p>
<p>그래서 precision과 recall 개념을 이용한다.</p>
<blockquote>
<p>Reference : Half of my heart is in Havana ooh na na
Predicted : Half as my heart is in Obama ooh na</p>
</blockquote>
<p>위와 같은 문장에서
<img src="https://images.velog.io/images/bo-lim/post/9d9141ef-72b6-48c3-8d41-5e194db8f9ba/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%202.59.11.png" alt=""></p>
<ul>
<li>Precision은 예측된 결과를 받는 우리가 실질적으로 느끼는 정확도이다.</li>
<li>Recall은 예측된 결과를 받는 우리가 못 보고 모른 채 넘어가는 정보 없이 얼마나 정보를 받는 지를 말해준다.</li>
</ul>
<p>위에서 precision 결과인 78과 recall 결과인 70의 산술평균을 구할 수도 있고 기하평균을 구할 수도, 조화평균을 구할 수도있다.</p>
<p>이 평균내는 방법들은 산술평균이 가장 크고 그 다음이 기하, 마지막이 조화순으로 크다.(산술 &gt; 기하 &gt; 조화)
<strong>조화평균을</strong> 이용하여 보다 작은 값에 더 많은 가중치를 부여한다.</p>
<p>F-measure는 precision과 recall의 조화평균이다.</p>
<p>하지만 </p>
<blockquote>
<p>Reference : Half of my heart is in Havana ooh na na
Predicted : Havana na in heart my is Half ooh oh na</p>
</blockquote>
<p>이러한 경우에서는 Precision, recall, F-measure 모두 100%가 된다. 하지만 순서가 전혀 맞지 않은 상태이다.</p>
<p>그래서 더 나아가 성능평가로 BLEU score를 사용한다.</p>
<h2 id="bleu-score-1">BLEU Score</h2>
<ul>
<li>하나하나 ground truth와의 비교뿐만 아니라 N-gram으로 연속된 단어와의 비교도 한다.</li>
<li>Recall은 무시하고 Precision만을 가지고 구한다.</li>
<li><blockquote>
<p>이는 NLP 번역의 특성을 생각해보면 이해가 간다. 얼마나 빠짐없이 번역을 했는가 보다는 번역이 된 문장이 얼마나 의미를 잘 담고있는지가 더 중요하기 때문이다.</p>
</blockquote>
</li>
</ul>
<p>$BLEU = min(1,\frac{length_of_prediction}{length_of_reference})(\prod_{i=1}^4 precision_i)^{\frac{1}{4}}$</p>
<ul>
<li>$(\prod_{i=1}^4 precision_i)^{\frac{1}{4}}$ </li>
<li><blockquote>
<p>이 부분은 precision의 기하평균을 내기위한 수식이다. 여기서 조화평균을 쓰지 않은 것은 여기서는 작은 값에 지나치게 가중치를 주기 때문이다.</p>
</blockquote>
</li>
<li>recall을 따로 구하지 않아도, 만약 모든 단어가 매칭된 상황이나 예측 문장 수가 더 많을 경우 recall이 높은 것을 당연하게 생각할 수 있다.</li>
</ul>
<blockquote>
<p>model 1 : Half as my heart is in Obama ooh na
model 2 : Havana na in heart my is Half ooh of na
이러한 상황일 때 각 n-gram Precision과 BLEU는 아래와 같다.
(brevity penalty는 문장의 길이를 말한다.)
<img src="https://images.velog.io/images/bo-lim/post/0be505ba-8a31-4630-b5be-587ecc61fdb6/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%203.33.36.png" alt=""></p>
</blockquote>
<h2 id="마무리">마무리</h2>
<p><em>BLEU Score가 왜 NLP에서 중요한 지를 느낄 수 있었다.
그리고 요즘 Action Segmentation에 대해서 공부하고 있는데, 이 task도 시계열 예측을 따르고 이 문장생성과 비슷한 점이 많아보여 BLEU를 사용해도 좋을 것 같다는 생각이 문득 들었다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Beam Search 알아보기]]></title>
            <link>https://velog.io/@bo-lim/Beam-Search</link>
            <guid>https://velog.io/@bo-lim/Beam-Search</guid>
            <pubDate>Mon, 14 Mar 2022 05:21:54 GMT</pubDate>
            <description><![CDATA[<h1 id="beam-search">Beam Search</h1>
<h2 id="greedy-decoding">Greedy decoding</h2>
<p>매 타임 스텝마다 높은 확률을 가지는 단어 하나만을 선택해서 진행한다.
이를 <strong>Greedy decoding</strong>이라고 한다.</p>
<p>알고리즘 공부했을 때 배운, 그리디 알고리즘처럼 당시 상황에서의 최선의 선택을 하기 때문에 앞에 Greedy가 붙은 것 같다.</p>
<p>이 단점중 하나는 <strong>뒤로 못 돌아가는 것</strong>이다.</p>
<h2 id="exhaustive-search">Exhaustive Search</h2>
<p>그래서 joint probability를 수식으로 사용해서 해결한다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/6f75b055-cf27-42a4-b310-7caa09133eef/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%201.43.22.png" alt="">
이렇게 해서 $P(y_1|x)$에서 작은 값을 가졌더라고 이후 값들에서 큰 값을 얻어 바뀔 수 있다.</p>
<ul>
<li>time step t까지의 모든 가능성을 따진다.</li>
<li><blockquote>
<p>너무 큰 시간 복잡도</p>
</blockquote>
<h2 id="beam-search-1">Beam Search</h2>
하나의 가능성만 보는 Greedy decoding과 모든 가능성을 보는 Exhaustive Search 사이에 있는 것이 Beam Search이다.</li>
</ul>
<p>-&gt; <strong>k</strong>개의 경우의 수를 고려하는 방식
k : beam size (일반적으로 5 ~ 10)</p>
<p>그리고 위의 수식에서 단어를 하나씩 생성하면서 그때의 확률값을 하나씩 모두 곱하였다.
이를 Log를 붙여 곱셈에서 덧셈으로 식을 변경한다.
<img src="https://images.velog.io/images/bo-lim/post/a4f75648-8663-4ad0-afe2-09f7cc044ae5/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%201.49.34.png" alt=""></p>
<p> <img src="https://images.velog.io/images/bo-lim/post/dc407af7-4ffa-4cd0-b362-d5add339557a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%201.57.53.png" alt="">
-&gt; 여기서 beam size는 2로 가지도 2개씩 만들어지는 것을 볼 수 있다.
그리고 누적 확률로 동일한 단어라도 이전 단어가 무엇이었냐에 따라 다르게 계산된다. 다시 상위 K개를 선택하고 이 과정을 반복한다.</p>
<p>디코딩을 끝낼 때, greedy decoding은 &lt;&#39;end&#39;&gt;토큰으로 끝내면 되지만
beam Search decoding시에는 서로 다른 시점에서 &lt;&#39;end&#39;&gt; 토큰을 만 들 수 있기 때문에 어느 하나라도 각 hypothesis에서 END 토큰을 만들면 해당 hypothesis를 종료한다.</p>
<blockquote>
<p>Stopping criterion</p>
</blockquote>
<ul>
<li>timestep T를 미리 설정해두었다가 T가 되면 종료할 수도 있고</li>
<li>n을 미리 설정하여 &lt;&#39;eos&#39;&gt;가 적어도 n개 이상이 되면 종료하는 방법도 있다.</li>
</ul>
<blockquote>
<p>Finishing up</p>
</blockquote>
<ul>
<li>완성된 hypotheses중에서 가장 높은 스코어 하나를 고른다.</li>
<li>이때, log버전의 join probability가 가장 큰 하나를 고른다.</li>
</ul>
<p>-&gt; 여기서 상대적으로 짧은 문장에서 joint probability가 높은 스코어를 가지는 문제점이 있다. ( 기존의 log값에 계속 -값을 계속 더하기 때문)</p>
<p>이 해결책으로 길이로 나눈다.
<img src="https://images.velog.io/images/bo-lim/post/b480de16-1036-46f5-9129-9f30a5600d4a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-14%20%EC%98%A4%ED%9B%84%202.17.19.png" alt=""></p>
<h2 id="마무리">마무리</h2>
<p><em>Beam Search공부하면서 슬라이딩 윈도우나 truncated backpropagation이 생각났다. 딥러닝에서는 매우 길어서 연산량이나 메모리에 부담스러우면 이런 식으로 하이터파라미터를 생성하고 자르는 것 같다...</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Sequence-to-Sequence | Attention]]></title>
            <link>https://velog.io/@bo-lim/Sequence-to-Sequence-Attention</link>
            <guid>https://velog.io/@bo-lim/Sequence-to-Sequence-Attention</guid>
            <pubDate>Fri, 11 Mar 2022 04:48:53 GMT</pubDate>
            <description><![CDATA[<p>Attention은 transformer 논문을 보면서 들었다. </p>
<p>이번에 포스팅으로 정리하면서 왜 attention이라고 부르는 지 궁금했는다.
RNN기반의 모델에 비해 각 단어들의 hidden vector들과 연산을 통해 무엇을 선별적으로 선택할 지를 말해주는 vector를 만들어서 무엇을 attention할 지를 말해주기 때문이라고 생각했다.</p>
<h1 id="seq2seq">Seq2Seq</h1>
<ul>
<li>Sequence to Sequence 모델은 NLP 중 many-to-many 타입에 해당되는 모델이다</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/05846936-835a-4825-965d-a3d2bfcdd6cb/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-11%20%EC%98%A4%EC%A0%84%2011.18.45.png" alt=""></p>
<ul>
<li>인코더와 디코더로 구성되어 인코더는 input을 받고 디코더는 output을 낸다.</li>
<li>서로 share하지 않는다.</li>
<li>세부구조를 보면 여기서는 lstm을 선택한 것을 볼 수 있다.</li>
<li>인코더 마지막 hidden state vector는 이전 타입 스텝의 hidden state 역할을 한다.</li>
<li>디코더에서는 시작 전 첫 토큰을 &lt;SoS(Start-of-Sentence)&gt;를 넣는다.</li>
<li>디코더에서 &lt;EoS(End-of-Sentence)&gt;가 나올때까지 생성한다.</li>
</ul>
<p>RNN기반의 모델들은 hidden state vector의 dimension이 정해져있어서, 짧은 문장이든 긴 문장이든 마지막 타임스텝인 hidden state vector(주황색)에 앞서 나온 정보들을 모두 넣어야한다.
-&gt; 매우 긴 문장이면 매우 압축된 형태, 앞부분 정보들이 많이 소실될 수 있다.</p>
<p>만약</p>
<pre><code>I go home</code></pre><p>을 모델에 넣는다면, I에 대한 정보가 유실될 수 있다. 그러면 주어에 대한 정보를 잃는 것이기 때문에 성능에 치명적인 영향을 준다.</p>
<p>=&gt; 연구자들은 문장 순서를</p>
<pre><code>home go I</code></pre><p>식으로 바꾸는 방법을 제안하기도 하였다.</p>
<h2 id="attention">Attention</h2>
<p>위의 문제를 해결하기 위해 attention 모델을 사용한다.</p>
<ul>
<li>인코더의 마지막 스텝인 hidden state vector(주황색)에만 의존하는 것이 아니라,
  각 단어를 입력 받았을 때마다 나오는 hidden state를 모두 디코더에 넘겨, 디코더에서는 이를 <strong>선별적</strong>으로 가져다가 사용한다.</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/f05d688e-a187-4c5b-a241-224c8f0198d4/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-11%20%EC%98%A4%EC%A0%84%2011.53.48.png" alt=""></p>
<ul>
<li>인코더에서 각 단어마다 hidden state가 만들어진다.</li>
<li>마지막 타임스텝이 디코더에 $h_0$에 입력으로 들어가고 &lt;Start(SoS)&gt;가 $x_1$으로 들어간다.</li>
<li>입력 받은 것을 바탕으로 디코더에서 $h_1^d$을 만든다.</li>
<li>단어들의 각 hidden state에서 선별적으로 정보들을 골라내는 과정을 수행하기 위해 각각 단어의 hidden state와 내적연산을 한다.</li>
<li>내적을 해서 나오는 값들을 유사도 score로 본다.</li>
<li>이 값들을 softmax를 통과시켜 확률값을 구한다.</li>
<li>이렇게 구한 확률값은 인코더의 가중치로 사용되고 가중 평균을 구할 수 있다.</li>
<li>마지막에 가중 평균된 벡터인 attention의 output과 디코더의 hidden state를 concat이 되어 output layer의 입력으로 들어간다.</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/899d2040-83d2-41ef-9de4-8d950515f057/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-11%20%EC%98%A4%EC%A0%84%2011.58.43.png" alt=""></p>
<ul>
<li>이전 디코더의 hidden state vector를 입력으로 받고 이전 output도 입력으로 받아 새로운 hidden state vector를 생성한다.</li>
<li>이전과 동일하게 각 단어의 hidden state vector와의 내적으로 유사도를 구하고 확률분포를 구한 후 인코더에 적용하여 output을 구한다.그리고 디코더 hidden state vector와 attention output을 concat하여 다음 결과를 만든다.</li>
</ul>
<p>-&gt; 중간 attention distribution벡터를 attention vector라고 부른다.</p>
<blockquote>
<p>그때마다 서로 다른 가중치를 인코더 hidden state vector에 적용해서 나오는 가중평균된 벡터를 각 output layer에 입력으로 사용하여 예측 성능을 높인다.</p>
</blockquote>
<p>디코더 hidden state 역활: attention 가중치 결정과 단어 예측을 위한 output layer의 입력</p>
<h2 id="teacher-forcing">Teacher forcing</h2>
<p>학습 할 때는 이전 예측된 결과를 학습에 쓰지 않고,
ground truth값을 넣어 잘못 학습되지 않도록 막는다.
-&gt; 그러나 이 방식은 실제 test할 때의 상황과는 다르다.</p>
<p>그래서 초반에는 teacher forcing 방식을 이용하다가 어느 지점 이후에서는 사용하지 않는 방식도 존재한다.</p>
<h2 id="attention-score">Attention Score</h2>
<p>Attention Score를 구하는 데는 3가지 방식이 있다.
<img src="https://images.velog.io/images/bo-lim/post/6d340950-d444-46ec-ab22-40fb1e5d8e56/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-11%20%EC%98%A4%ED%9B%84%201.35.12.png" alt=""></p>
<p>1) Dot은 말 그대로 dot product로 연산하는 것
2) general은 가운데 $W_a$를 두어 가중치 역할을 하도록 한다.
3) concat은 디코더 hidden state와 인코더 벡터를 concat하고 fully connected layer 하나를 두어 최종 스카라 값을 구한다. 이는 여러 layer로 확장할 수 있다.</p>
<blockquote>
<p>기존 연산만을 통해 구해졌던 attention score가 학습 가능한 가중치 연산이 추가되었다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL(Today I Learned) - 3월 첫째 주]]></title>
            <link>https://velog.io/@bo-lim/TILToday-I-Learned-3%EC%9B%94-%EC%B2%AB%EC%A7%B8-%EC%A3%BC</link>
            <guid>https://velog.io/@bo-lim/TILToday-I-Learned-3%EC%9B%94-%EC%B2%AB%EC%A7%B8-%EC%A3%BC</guid>
            <pubDate>Tue, 08 Mar 2022 10:48:34 GMT</pubDate>
            <description><![CDATA[<h2 id="0307">03.07</h2>
<h3 id="부스트캠프">부스트캠프</h3>
<p>NLP 트랙의 첫 시작으로 <strong>NLP의 여러가지 task들과 Bag-of-Words와 word embedding</strong>에 대하여 공부하였다.
실습과제로 직접 워드 임베딩 과정을 구현해보고 spacy, konlpy를 사용해보았다.
그리고 새로운 팀원들과 앞으로 피어세션 시간때 
월요일에는 논문리뷰, 화요일, 목요일에는 알고리즘 3문제, 수요일, 금요일에는 ai 인터뷰 질문 3개씩 준비해오기로 하였다.</p>
<h3 id="연구실">연구실</h3>
<p>ms-tcn 공식 구현 코드에 따로 전처리를 한 <strong>데이터셋</strong>을 사용해야된다. 그래서 데이터를 다운 받아 서버에 올리려는데 너무 용량이 커서 잘 안올려진다.ㅜㅜ</p>
<h2 id="0308">03.08</h2>
<h3 id="부스트캠프-1">부스트캠프</h3>
<p>오늘은 <strong>RNN, LSTM과 GRU</strong>에 대해 공부하였다. 
그리고 알고리즘 공부를 위해 백준 3문제를 풀었다.</p>
<p><strong>이력서에 대한 특강</strong>을 들었는데, 얼른 나의 상황과 목표, 무엇을 해왔고 어떤 의미가 있었는 지를 정리해서 앞으로 의미있는 결정들을 하고싶다는 생각이 들었다.</p>
<h2 id="0309">03.09</h2>
<p>Seq2Seq with Attention를 공부하고
AI 면접 예상문제에 대해 고민하였다.</p>
<p>transformer 논문을 읽었지만 정학히 어텐션 개념에 대한 이해가 부족했었다는 것을 알았다. 그리고 어텐션이 무엇인지 확실히 알 수 있었다.</p>
<h2 id="0310">03.10</h2>
<p>오늘은 과제에 집중하였으며 
Data Processing과 Vocabulary만드는 알고리즘을 짜는 과제를 하였다.
그리고 RNN based 모델을 구현하고 데이터들을 배치에 맞게 shape를 바꾸는 과제도 수행하였다.
그리고 백준 3문제도 풀면서 알고리즘 공부를 하였다.</p>
<h2 id="0311">03.11</h2>
<p>오늘도 과제를 하였는데 Subword 임베딩에 대한 과제였다.
생각보다 힘들어서 많은 시간을 투자했는데
알고보니 논문에 pseudo code가 있었는데 모르고 풀었다가 나중에 피어세션때 팀원분이 알려주셨다...😯</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Word Embedding | Word2Vec, GloVe]]></title>
            <link>https://velog.io/@bo-lim/Word-Embedding-Word2Vec-GloVe</link>
            <guid>https://velog.io/@bo-lim/Word-Embedding-Word2Vec-GloVe</guid>
            <pubDate>Mon, 07 Mar 2022 06:41:23 GMT</pubDate>
            <description><![CDATA[<h1 id="word-embedding">Word Embedding</h1>
<ul>
<li>단어들을 특정한 차원으로 이루어진 공간 상의 한 점, 좌표로 변환해주는 기법</li>
<li>text dataset을 학습 데이터로 제공하고
dimension수를 사전에 정하여 알고리즘에 전달하면
결과 값으로 각각의 단어의 최적의 벡터 표현형이 나온다.</li>
<li>비슷한 단어는 가까운 공간에 표현되도록 한다.</li>
<li>이후 다른 task 모델에 데이터를 넣을 때, 성능을 향상시킨다.<h2 id="word2vec">Word2Vec</h2>
워드 임베딩 중 유명한 알고리즘이다.
같은 문장에서 나타난 인접한 단어들 간의 의미가 비슷할 것이라는 가정을 사용한다.
e.g</li>
<li>The cat purrs.</li>
<li>This cat hunts mice.
<img src="https://images.velog.io/images/bo-lim/post/0ee05346-5d6c-48db-80f7-d2faaad4ab75/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.38.46.png" alt=""></li>
</ul>
<p>cat 주변 단어들의 확률분포를 예측한다.
<img src="https://images.velog.io/images/bo-lim/post/7c9ce134-156a-45f8-8d53-b62102c7b69b/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.39.59.png" alt=""></p>
<p>주어진 학습 데이터: &quot;I study math.&quot;
-&gt; Tokenizing
-&gt; 단어들을 모아 사전 구축
-&gt; 사전 사이즈 만큼의 one-hot vector로 표현
-&gt; sliding window로 한 단어를 중심으로 앞뒤로 나타난 단어 각각과 입출력 단어쌍 구성(window size: 3이면 [(I,study),(study,I),(study,math)...])
-&gt; 위의 단어쌍을 갖고 예측 task를 수행하는 fully layer
아래는 (study,math)를 가지고 진행된 알고리즘의 이미지이다.
(study[0,1,0], math[0,0,1])
<img src="https://images.velog.io/images/bo-lim/post/cb50c150-c85c-4665-b34f-fcf987ba9e1a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.47.20.png" alt=""></p>
<ul>
<li>Input, Output layer는 3차원, hidden layer는 2차원이다.</li>
<li>x : study, y : math</li>
<li>원-핫 벡터이기 때문에 결국 파란색으로 칠해진 부분의 연산만 이루어진다.</li>
</ul>
<p><em><strong><a href="https://ronxin.github.io/wevi/">https://ronxin.github.io/wevi/</a> 를 이용하여 시각적으로 볼 수 있다.</strong></em></p>
<p>Word2Vec 결과 아래처럼 벡터 연산으로 표현이 가능하다.
vec[queen] – vec[king] = vec[woman] – vec[man]
<img src="https://images.velog.io/images/bo-lim/post/b5992db7-06dd-4300-bcca-37522c9e0bc5/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%203.17.40.png" alt=""></p>
<ul>
<li>Word2Vec을 통해 
여러 단어가 있을때 나머지 단어와 가장 상이한 단어를 찾는 task인
Intrusion detection도 해결할 수 있다.</li>
</ul>
<p>이외의 다양한 task에서도 사용된다.</p>
<h2 id="glove">GloVe</h2>
<p>또 다른 워드 임베딩 방법이다.</p>
<blockquote>
<p>Word2Vec과의 가장 큰 차이점은 데이터의 입출력 단어쌍에 대해서 하나의 window 내에서 얼마나 동시에 자주 나오는지를 사전에 미리 계산하고
입출력 워드 임베딩 벡터의 내적과 logP가 서로 가까워 지도록 loss function을 만든다는 것이다
<img src="https://images.velog.io/images/bo-lim/post/d18e9986-e4cb-4895-8ffa-77da68534afd/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%203.27.47.png" alt=""></p>
</blockquote>
<ul>
<li>$u_i$ : 입력word의 임베딩 벡터</li>
<li>$v_j$ : 출력word의 임베딩 벡터</li>
<li>$P_{ij}$ : 두 단어가 한 윈도우 내에서 얼마나 동시에 자주 나타났는자</li>
</ul>
<p>장점 : </p>
<ul>
<li>중복되는 계산을 줄여준다. -&gt; 학습속도 향상</li>
<li>더 적은 데이터에 대해서 잘 학습된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Bag-of-Words & NaiveBayes Classifier | NLP]]></title>
            <link>https://velog.io/@bo-lim/Bag-of-Words-NaiveBayes-Classifier-NLP</link>
            <guid>https://velog.io/@bo-lim/Bag-of-Words-NaiveBayes-Classifier-NLP</guid>
            <pubDate>Mon, 07 Mar 2022 05:18:00 GMT</pubDate>
            <description><![CDATA[<h2 id="bag-of-words">Bag-of-words</h2>
<p>단어 등을 숫자형태로 나타내는 기법</p>
<h3 id="step-1-vocabulary-구축">Step 1. Vocabulary 구축</h3>
<ul>
<li>유니크한 단어들을 모아서 사전에 등록한다.
예시로 &quot;John really really loves this movie&quot;,&quot;Jane really likes this song.&quot; 문장이 있다면
사전 Vocabulary에는 {&quot;John&quot;,&quot;really&quot;,&quot;loves&quot;,&quot;this&quot;,&quot;movie&quot;,&quot;Jane&quot;,&quot;likes&quot;,&quot;song&quot;}이 등록된다.<h3 id="step-2-encoding">Step 2. Encoding</h3>
Categorical 데이터를 모델에 적용하기 위해 one-hot vector로 바꿔준다.
<img src="https://images.velog.io/images/bo-lim/post/043ae83c-af16-43a7-b514-f8357c463249/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%201.57.34.png" alt=""></li>
<li><blockquote>
<p>어떤 단어쌍이든 유클리드 distance : $\sqrt 2$</p>
</blockquote>
</li>
<li><blockquote>
<p>cosine 유사도 : 0
=&gt; 의미에 상관없이 모두가 동일한 관계</p>
</blockquote>
<h3 id="step-3-확장">Step 3. 확장</h3>
각 문장에 포함된 워드 벡터들을 합한다. -&gt; Bag-of-Words
<img src="https://images.velog.io/images/bo-lim/post/740669e0-b4e6-4fdc-89a7-79fa59f20092/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.00.52.png" alt=""><h2 id="naivebayes-classifier">NaiveBayes Classifier</h2>
이제 위에서 표현한 벡터들을 이용해서 분류기를 생성한다.<blockquote>
<p>Class : C
documet : d 이면
$C_{MAP} = argmax_{c\in C} P(c|d) \
; = argmax_{c\in C} \frac{P(d|c)P(c)}{P(d)}\
; = argmax_{c\in C} P(d|c)P(c)$</p>
</blockquote>
</li>
</ul>
<p>1) MAP : Maximum a posteriori
2) P(d)를 상수값으로 보고 무시한다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/2f249e32-1c99-4fc0-848e-bff3b6de3a45/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.10.23.png" alt="">
여기서 <strong>P(C_cv) = P(C_nlp) = 1/2</strong> 이다</p>
<p>그리고 각 P(d|c)를 구하면 아래와 같다.
<img src="https://images.velog.io/images/bo-lim/post/36e5be98-b149-4c74-a082-16dc7a09af6d/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.11.49.png" alt=""></p>
<p>그래서 마지막 test 문장을 구하려면 아래와 같은 식을 세운다.
<img src="https://images.velog.io/images/bo-lim/post/1c41299b-025c-4af5-808e-537e3208c4cd/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-07%20%EC%98%A4%ED%9B%84%202.14.11.png" alt=""></p>
<ul>
<li>문제점 : 학습 데이터 안에서 특정 클래스 내에서 특정 단어가 나오지 않았을 경우 그 단어가 해당 클래스로 분류될 가능성이 0이 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Alleviating Over-segmentation Errors by Detecting Action Boundaries | ASRF | 논문 정리 | Action Segmentation]]></title>
            <link>https://velog.io/@bo-lim/Alleviating-Over-segmentation-Errors-by-Detecting-Action-Boundaries-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC-Action-Segmentation</link>
            <guid>https://velog.io/@bo-lim/Alleviating-Over-segmentation-Errors-by-Detecting-Action-Boundaries-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC-Action-Segmentation</guid>
            <pubDate>Fri, 04 Mar 2022 07:13:51 GMT</pubDate>
            <description><![CDATA[<h1 id="alleviating-over-segmentation-errors-by-detecting-action-boundaries">Alleviating Over-segmentation Errors by Detecting Action Boundaries</h1>
<p>Author: AIST, Keio Univ., Yuchi Ishikawa
Reading date: February 26, 2022
Submitted date: July 14, 2020
Summary: ASRF
Type: Paper</p>
<h1 id="abstract--introduction">Abstract &amp; Introduction</h1>
<p>ASRF - Action Segment Refinement Framework</p>
<p>모델은 long-term feature extractor와 </p>
<p>2개의 branch( the Action Segmentation Branch (ASB) &amp; the Boundary Regression Branch (BRB))로 구성되어있다.</p>
<p>Long-term feature extractor는 공유된 feature들을 넓은 temporal receptive field와 함께 2개의 branch에 제공한다.</p>
<p>ASB는 action classes를, BRB는 action boundary probabilities를 예측한다.</p>
<p>ASB에서 나온 output들을 BRB의 예측한 action바운더리를 이용하여 refine한다.</p>
<p>둘은 서로 보완해주는 관계로 action segmentation에서 조심해야할 over-segmentation error를 줄여준다.</p>
<ol>
<li>ASRF로 frame별 action classification하고 action boundary regression을 한다.</li>
<li>action 변환인 smoothing하게 loss function을 정의한다.</li>
<li>3개의 데이터셋(50 Salads, GTEA, Breakfast dataset)에 SOTA 달성</li>
</ol>
<h1 id="related-work">Related Work</h1>
<p>action segmentation 모델들의 흐름 등을 설명하였는데 이후 Action Proposal Generation에 대하여 나왔다.</p>
<p>이 분야는 생소해서 유의깊게보았다. 2가지 타입의 접근이 있는데 하나는 anchor-based와 anchor-free approaches이다.</p>
<p>이 논문 모델은 anchor-free approaches에서 영감을 받아 action boundary regression network를 추가적으로 사용하였다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/9bce65bd-1eb4-4d14-84a2-568e134f0203/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-28_%EC%98%A4%ED%9B%84_12.27.13.png" alt=""></p>
<h2 id="our-proposed-method">Our Proposed Method</h2>
<ol>
<li><p>Long-term feature extractor</p>
</li>
<li><p>2 branched</p>
<ol>
<li><p>ASB : Action Segmentation Branch</p>
</li>
<li><p>BRB : Boundary Regression Branch</p>
<p>2개의 브랜치 모두 features를 입력으로 받고 frame-level action predictions, action boundary probabilities를 아웃풋으로 내보낸다.</p>
</li>
</ol>
</li>
</ol>
<h3 id="long-term-feature-extractor">Long-term Feature Extractor</h3>
<p>목적 : action segments사이 long-term depedencies를 잡아내고 rich features를 추출하는 것</p>
<p>→ $X^’ \in \mathbb{R}^{T*D^’}$</p>
<p>dilated residual layer가 있는 TCN을 사용하였다. 그래야 full temporal resolution과 넓은 receptive field로 컨볼루션 연산을 할 수 있기 때문이다.</p>
<p>long-term depedencies를 잡아내고 이후 브랜치들에 공유되는 피처들을 추출한다.</p>
<p>논문에서는 각 0.5비율의 dropout layer가 붙고 64개의 필터가 있는 10 dilated residual layers, 그리고 dilation rate는 매번 residual conv마다 2배씩 늘어난다.</p>
<h3 id="action-segmentation-branch">Action Segmentation Branch</h3>
<p>목적 : frame-wise action classes C 를 예측하는 것</p>
<p>1D convolutional layer와 softmax를 사용한다. 그러나 여기서 over-segmentation error가 잘 발생하기 때문에 multi-stage architecture를 추가했다.</p>
<p>첫 레이어에서는 $X^’$를 입력으로 받아 첫 predictions 결과를 내고 이후 레이어에서 이를 계속 refine하는 과정을 거친다.</p>
<p>이러한 구조는 over-segmentation 에러를 막으면서 temporal depedencies를 알아내고 action segments를 예측하기에 좋다.</p>
<p>논문에서는 각 stage는 커널 사이즈가 1, 64개의 필터를 가진 single temporal convolution, 10 dilated residual convolutions, 그리고 feature dimenstion을 action 클래스 크기까지 감소를 위한 다른 temporal convolution을 포함한다.</p>
<p>첫 prediction이후 stage는 3개</p>
<h3 id="boundary-regression-branch">Boundary Regression Branch</h3>
<p>몇몇 TCN들로 부터 action segmentation 성능을 좋게 만들수 있지만, 여전히 over-segmentation 문제가 남아있다.</p>
<p>목적 : action boundary probabilities 예측 (0 ~ 1) </p>
<p>→ action class에 상관없이 시작과 끝인지 아닌지,</p>
<p>나중에 결과를 refine하는 과정에서 사용된다.</p>
<p>클래스를 알고 학습하는 방법보다 이렇게 클래스에 상관없이 진행하는 BRB는 taining data를 훨씬 적게 필요로하고 robustness를 향상시킨다.</p>
<h3 id="refining-action-segmentation-results">Refining Action Segmentation Results</h3>
<p>ASB로 부터 class결과 C를 action boundary probabilities $P_b$를 이용하여 refine한다.</p>
<ol>
<li><p>$P_b$로 부터 action boundaries($B \in {0, 1}^T$) 결정 </p>
</li>
<li><p>B를 frame-level prediction으로 정의한다. </p>
<p> B : action boundary에 대한 prediction</p>
</li>
</ol>
<h3 id="loss-function">Loss function</h3>
<p>frame별 action 예측 결과와 action boundary 예측결과 이렇게 ASB, BRB에서 2개의 아웃풋이 나오기 때문에 loss도 2개에 대한 loss를 합한다.</p>
<p>$L = L_{asb} + \lambda L_{brb}$</p>
<p>논문에서는 GTEA에서는 $\lambda$를 0.2, 50 Salads와 Breakfast dataset에서는 0.1로 설정하였다.</p>
<h3 id="loss-function-for-asb">Loss function for ASB</h3>
<p>분류문제에서 자주 사용하는 cross-entropy loss를 사용한다.</p>
<p>$L_{ce} = \frac{1}{T}\sum_t - log(y_{t,c})$</p>
<p>그러나 이 방법은 temporal transtion에 대한 제재가 없기 때문에 over-segmentation을 막기에는 부족하다. </p>
<p>그래서 추가적은 Truncated Mean Squared Error(TMSE)를 사용하였다.</p>
<p>$L_{TMSE} = \frac{1}{TN}\sum_{t,c}\tilde{\Delta}^2_{t,c}$</p>
<p>$\tilde{\Delta}<em>{t,c} = \binom{\Delta</em>{t,c}: \Delta_{t,c} \leq \gamma}{\gamma ; : otherwise}$</p>
<p>$\Delta_{t,c} = |log , y_{t,c} - log , y_{t-1,c}|$</p>
<p>T : video길이, N : 클래스 개수, $\gamma$ : probabilities transition 에 대한 threshold</p>
<p>2개의 다른 Loss 함수.</p>
<ol>
<li><p>class weight에 대한 cross entropy loss $L_{ce,cw}$ - action segment가 얼마나 자주 바뀌는지</p>
<p> 학습시키는 동안 imbalance하기 때문에 median frequency balancing(각 class별 가중치를 계산하여 class frequency의 median으로 나눈다.)을 사용한다. 이후 실험에서 Focal Loss와 비교한다.</p>
</li>
<li><p>TMSE를 변형시킨 Gaussian Similarity-weighted TMSE(GS-TMSE) - TMSE는 프레임 사이 action probabilities transition을 smooth하기 위해 모든 프레임에 불이익을 준다. 그러나 이렇게 하면 실제로 바뀌어야할 부분에도 불이익을 준다.</p>
<p> 이 부분을 해결하기 위해 가우시안 커널을 추가한다.</p>
<p> $L_{GS-TMSE} = \frac{1}{TN}\sum_{t,c}exp(-\frac{||x_t-x_{t-1}||^2}{2\sigma ^2})\tilde{\Delta}_{t,c}^2$ </p>
<p> $x_t$: frame t의 similarity 인덱스 , $\sigma$ : 분산</p>
<p> 가우시안 커널은 프레임의 similarity를 기반으로 하기 때문에, 이 함수는 비슷한 weight인데 큰 차이가 있는 근접한 프레임에 불이익을 준다.</p>
<p> 논문에서는 $\sigma =1.0$으로 맞췄다.</p>
</li>
</ol>
<p>ASB에서 각 prediction의 loss function →</p>
<p>$L_{as} = L_{ce} + L_{GS-TMSE}$</p>
<p>ASB에서 각 prediction loss의 평균 →</p>
<p>$L_{asb} = \frac{1}{N_{as}}\sum_{i}L_{as,i}$ </p>
<p>$N_{as}$: ASB에서 predictions 수 ( 논문 프레임워크에서는 4 )</p>
<h3 id="loss-function-for-brb">Loss Function for BRB</h3>
<p>$L_{bl} = \frac {1}{T}\sum^{T}_{t=1}(w_py_t * log , p_t + (1 - y_t) * log(1 - p_t))$ </p>
<p>$y_y, p_t$ : frame t에 대한 ground truth, action boundary probability</p>
<ul>
<li>action boundary의 프레임 수들이 다른 것들보다 매우 작기 때문에 $w_p$ 양수 샘플들에 가중치를 둔다.</li>
<li>양의 데이터 점 비율을 계산하고 이것의 역수를 가중치로 사용</li>
</ul>
<p>그리고 ASB처럼 평균 →</p>
<p>$L_{brb} = \frac{1}{N_{br}}\sum_iL_{bl,i}$</p>
<h2 id="experiments">Experiments</h2>
<h3 id="evaluation-metrics-for-action-segmentation">Evaluation Metrics for action segmentation</h3>
<ul>
<li>frame-wise accuracy</li>
<li>segmental edit distance<ul>
<li>$S_{edit}(G,P)$</li>
<li>G(ground truth)와 P(predicted segments)사이의 차이 측정</li>
</ul>
</li>
<li>segmental F1 score<ul>
<li>class 별 평균낸다.</li>
<li>분류 예측이 맞았는지(조건 : threshold보다 더 큰 IoU)</li>
<li>temporal shift와 상관 없음</li>
</ul>
</li>
</ul>
<h3 id="evaluation-metrics-for-boundary-regression">Evaluation Metrics for Boundary Regression</h3>
<ul>
<li>action boundary regression<ul>
<li>semantic segmentation의 boundary F1 score 참고</li>
<li>$B_{gt}$: boundary인지 아닌지</li>
<li>$P_b$ : 예측된 바운더리 확률 맵</li>
<li>$B_{pred}$ : frame별 예측($P_{b,t}$가 threshold를 넘고 local maximum)</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/45309a76-874d-4e10-bbbe-c84c89bfdcfc/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%EC%A0%84_2.18.56.png" alt=""></p>
<ul>
<li>$I[*]$ : indicator function</li>
<li>$d(*)$ : L1 distance</li>
<li>논문에서는 $\theta_b : 5, ; \theta_p : 0.5$로 설정</li>
</ul>
<p>$BF(Boundary F1 metric) = \frac{2 * Precision * Recall}{Precision + Recall}$ </p>
<h3 id="learning-scheme">Learning Scheme</h3>
<ul>
<li>Adam optimizer - lr : 0.0005, bs:1</li>
<li>nested cross-validation</li>
</ul>
<h3 id="comparing-asrf-with-the-state-of-the-art">Comparing ASRF with the state-of-the-art</h3>
<p><img src="https://images.velog.io/images/bo-lim/post/43b49240-ab2c-42f8-af7d-31bb04eacd20/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%ED%9B%84_12.39.07.png" alt=""></p>
<p>(d)에서 잘못된 예측값을 확인할 수 있는데</p>
<p>이는 ASB에서부터 잘못된 segment로 나오면 완전히 다른 segment로 재할당할 수 없다는 것을 보여주기도 한다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/411b8026-48fe-4ae1-bb85-fc6ecf91844d/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%ED%9B%84_12.42.15.png" alt="">
<img src="https://images.velog.io/images/bo-lim/post/2cf5269b-218b-4e5e-ba98-4c07da63a15d/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%ED%9B%84_1.22.44.png" alt=""></p>
<h3 id="effect-of-our-refining-paradigm">Effect of our refining paradigm</h3>
<p>BRB이외의 다른 postprocessing methods</p>
<ul>
<li>Relabeling - 특정 시간 span이 $\theta_t$보다 짧으면 이전 segment로 relabel</li>
<li>Smoothing - 1D 가우시안 필터를 사이즈 K인 커널로 action probabilities smoothing</li>
<li>Similarity - frame별 유사도를 기반으로 예측된 action boundaries를 refinement, 이전 ASB loss에서도 유사성 측정했으며, 유사성이 local minimum인 action boundary</li>
</ul>
<p><img src="https://images.velog.io/images/bo-lim/post/eaaced0a-e3df-465e-a830-67e0006a25d5/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%ED%9B%84_1.19.58.png" alt=""></p>
<p>논문에서는 smoothing 방식은 ASRF보다 영향력이 적고, Similarity는 부정적인 영향을 끼치며, relabeling은 다른 두 방법들 보다는 좋지만 하이퍼파라미터 $\theta_t$의 영향을 많이 받기 때문에 ASRF 방식이 다른 방법들보다 우수하다고 한다.</p>
<h3 id="comparision-with-segment-level-classifier">Comparision with segment-level classifier</h3>
<p>single TCN vs ASRF</p>
<p><img src="https://images.velog.io/images/bo-lim/post/1846df11-bad2-4e72-8898-4f2235faad1e/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-03-03_%EC%98%A4%ED%9B%84_2.10.02.png" alt=""></p>
<h3 id="ablation-study">Ablation Study</h3>
<h4 id="effect-of-the-number-of-stages">Effect of the number of stages</h4>
<ul>
<li>각 네트워크 stage는 10 dilated convolutions &amp; 2 convolutions (BRB와 같은)</li>
</ul>
<p>3 stages가 가장 좋았다. 이상 넘어가면 오버피팅(특히 50 Salads dataset에서)</p>
<ul>
<li><p>BRB의 precision이 낮아도 overdetected boundaries는 refinement를 여전히 잘 돕는다.</p>
<p>  낮은 precision은 사람의 annotation과 action boundary의 모호함으로 인해 정밀하게 action boundary를 예측하기 어렵기 때문에 낮게 나온다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[IProgress not found. Please update jupyter and ipywidgets]]></title>
            <link>https://velog.io/@bo-lim/IProgress-not-found.-Please-update-jupyter-and-ipywidgets</link>
            <guid>https://velog.io/@bo-lim/IProgress-not-found.-Please-update-jupyter-and-ipywidgets</guid>
            <pubDate>Mon, 28 Feb 2022 08:21:42 GMT</pubDate>
            <description><![CDATA[<p>파이토치 Efficient Net이나 RegNet을 쓰려고 하니까 </p>
<pre><code>IProgress not found. Please update jupyter and ipywidgets</code></pre><p>이런 에러가 떴다.</p>
<p>jupyter와 ipywidgets를 업데이트도 해봤는데 계속해서 떴다.</p>
<p>그러다가 콘솔에 downloading &quot;http~~&quot; to 현재dir/torch/hub/checkpoints
라는 출력을 보았다. 
해당 url에 들어가니까 직접 pth파일을 다운 받을 수 있었고 
이를 위의 dir로 이동시켜주니 바로 해결되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ASFormer 논문 정리 | Action Segmentation]]></title>
            <link>https://velog.io/@bo-lim/ASFormer-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC-Action-Segmentation</link>
            <guid>https://velog.io/@bo-lim/ASFormer-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC-Action-Segmentation</guid>
            <pubDate>Sat, 26 Feb 2022 07:26:19 GMT</pubDate>
            <description><![CDATA[<p>이 논문은 2021년에 나온 Transformer를 action segmentation task에 맞게 변형시킨 모델에 대해 나와있다.</p>
<p>NLP의 Transformer가 CV에서도 활용되어 여러 논문들이 나왔다고 들었는데 action segmentation task에도 나온 걸 보니 신기하다.</p>
<p>내 개인적인 생각으로는 action segmentation도 NLP 기계번역 분야처럼 순서나 위치, 이웃간의 상관관계 같은 것들이 중요하기 때문에 Transformer와 잘 맞을 것 같다는 생각이 들었다.</p>
<h1 id="asformer-transformer-for-action-segmentation">ASFormer: Transformer for Action Segmentation</h1>
<p>Author: Hangqiu Yi, Hongyu Wen, Tingting Jiang
Submitted dat: August 16, 2021</p>
<h1 id="abstract">Abstract</h1>
<p>NLP에서 유명한 Transformer를 변형하여 만든 모델이다.</p>
<p>모델의 3가지 특징 </p>
<ul>
<li>feature들의 high locality로 인해  local connectivity inductive bias를 가져올 수 있다. 이는 action segmentation taks에서 적은 학습 데이터를 가지고 적절한 target function을 학습시킬 수 있다.</li>
<li>pre-defined hierarchical representation pattern을 적용할 수 있다. → 이는 긴 input sequences를 효율적으로 다룰 수 있다.</li>
<li>인코더로부터 initial predictions를 수정할 수 있는 디코더를 디자인했다.</li>
</ul>
<h1 id="introduction">Introduction</h1>
<p>기존 vanilla transformer를 action segmentation task에 적용했을 때, 주요 문제점과 해결</p>
<ol>
<li><p>training set의 작은 사이즈로 인해 inductive biases 부족은 병목현상을 초래한다. </p>
<p> → action segmentation의 특징 중 하나는 높은 locality 피처들이다. 그래서 local connectivity inductive bias가 굉장히 중요하다. 그래서 모델은 hypothesis space를 reliable 범위안으로 제한해서 </p>
</li>
<li><p>긴 비디오에 대한 self-attention 적용은 transformer가 효과적으로 표현하기 힘들다. 이는 비디오의 길이로 인해 의미있는 locations에 집중하도록 하는 적절한 weigths 학습이 힘들다는 것이다.</p>
<p> → pre-defined hierarchical representation pattern을 각 self-attention layer들에 적용한다. 이는 low-level self-attention layer들을 local relation에 먼저 집중하도록 한 후, 점진적으로 high-level layer들 쪽으로 넓히는 것이다. </p>
<p> 이 결과 수렴 시간과 성능을 높일 수 있다. 그리고 이러한 계층적으로 표현하는 패턴은 time complexity와 total space도 줄일 수 있다.</p>
</li>
<li><p>기존의 인코더-디코더 구조는 action segmentation task의 refinement 부분과 맞지 않다. 원래 action segmentation 모델들은 initial prediction 이후 다시 refine하는 과정을 반복하는데 트랜스포머는 이와 맞지 않다.</p>
<p> → 디코더에 cross-attention 구조를 넣는다. 이는 인코더의 모든 포지션이 refinement 과정에 들어가도록 한다. 동시에 학습된 피처 space에 대한 인코더의 방해도 막는다.</p>
</li>
</ol>
<p><img src="https://images.velog.io/images/bo-lim/post/14271be4-4996-40ba-b236-e54f274bb03a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_12.10.22.png" alt=""></p>
<p>(b)는 반복적인 refinement를 위한 구조</p>
<p>인코더에서 video sequences를 받고 intial predictions를 내보낸다. 인코더안에는 pre-defined hierachical representation patterns가 들어잇다.</p>
<p>디코더에는 predictions를 input으로 받고 인코더와 비슷한 구조를 갖고 있다.</p>
<p>(a)에서 인코더 블록은 dilated conv를 가진 feed-forward layer와 self-attention layer, residual connections를 가지고 있다.</p>
<p>(c)에서 디코더 블록을 보면 인코더에서 정보를 가져오기 위해 cross-attention 구조를 갖고 있다.</p>
<h1 id="methods">Methods</h1>
<p>Transformer 구조로 된 인코더 디코더 구조를 가진다. </p>
<p>인코더가 미리 추출된 frame-wise 비디오 feature sequence를 인풋으로 받고 첫  predictions를 내보낸다. 그러면 디코더가 이를 인풋으로 받아 refinement 하는 과정을 반복한다.</p>
<p>인코더에서 적은 학습데이터셋과 긴 비디오 시퀀스를 어떻게 다루는 지 보여주고</p>
<p>디코더에서 여러 action segments 사이의 temporal relation의 이점을 다룬다.</p>
<h2 id="encoder">Encoder</h2>
<p>미리 추출된 입력 sequence의 크기는 TxD</p>
<p>T: video 길이, D: feature dimension</p>
<p>인코더의 첫 레이어는 fully connected layer로 입력 피처를 받아 predicitions $y_e \in R^{T*C}$ 를 아웃풋으로 내보낸다.</p>
<p>C: action class 수</p>
<p>각 인코더 layer는 2개의 sub-layers를 가진다. → feed-forward layer와 single-head self-attention layer. 추가로 각 sub-layers 사이에 residual connection도 있다.(위의 그림 참고)</p>
<p>기존 Transformer와 다르게 dilated temporal convolution을 feed-forward layer로 넣었다.(원래는 point-wise fully connected layer)</p>
<p>→ training set의 부족과 high locality of features를 고려한 변형</p>
<p>self-attention layersms 의미있는 location을 찾기 힘들고 서로 모여서 효과적인 representation을 형성하기 힘들다.</p>
<p>→ 이 문제를 해결하기 위해 pre-defined hierachical representation pattern을 적용한다. </p>
<p>그리고 w사이즈의 local window 로 self-attention layer의 receptive fields를 제한한다. 이 사이즈는 레이어마다 2배씩 증가한다.</p>
<p>인코딩 depth가 증가할수록, temporal conv 레이어의 dilation rate도 2배씩 증가시킨다.self-attention 레이어에서는 그대로 유지한다.</p>
<p>이런 계층적인 패턴은 우선 local feature에 집중하도록 하고 점진적으로 receptive field를 넓혀 global information을 볼 수 있게 한다.</p>
<p>추가로 기존 transformer의 메모리 사용량은 대략 J<em>T</em>T이다.</p>
<p>이를 계층적 표현 패턴으로 $((2-\epsilon ) * 2^J * T)$로 줄일 수 있다.</p>
<h2 id="decoders">Decoders</h2>
<p>take bottle, pour water 다음은 drink water와 같이 multiple action segments간에는 temporal relations가 존재한다. 이는 action segmentation task에서 매우 중요한 역할을 한다.</p>
<p>디코더에서는 temporal relations를 잘 찾아서 인코더가 전달한 initial predictions를 refinement 과정을 통해 성능을 높인다.</p>
<h3 id="a-single-decoder">A Single Decoder</h3>
<p>먼저 설명을 위해 하나의 디코더를 살펴보자면,</p>
<p>디코더의 첫번째 레이어는 차원을 맞추기 위해 fully-connected layer로 구성되어있다. 그 뒤에 디코더 블럭들이 차례로 붙는다.</p>
<p>구조는 인코더와 비슷하게 feed-forward layer와 hierarchical pattern이 있으며, cross-attention layer가 적용되는 점이 다르다.</p>
<p>self-attention과 다르게 cross-attention은 우선 Q(query), K(key)를 인코더와 이전 레이어의 output의 concat에서 얻는 반면에 V(value)는 concat전 이전 레이어의 output에서 얻는다는 점이 다르다.</p>
<p>→ 이러한 구조로 refinement 과정에서도 모든 포지션의 인코더가 관여할 수 있도록 하였다. V는 인코더의 방해없이 오로지 input predictions으로부터 만들어진다.</p>
<p>이전 연구들에서도 보여줬듯이 refinement 과정은 학습된 feature space의 방해에 매우 민감하다.</p>
<h3 id="multiple-decoders">Multiple Decoders</h3>
<p>iteratice refinement를 위해 위의 single decoder를 확장시킨다.</p>
<p>cross-attention은 외부 정보를 가져오는데, error accumulation 문제를 피하기 위해서 외부에서 가져오는 정보의 weight를 줄인다.</p>
<p>$out = feed_forward(x)$</p>
<p>$out = \alpha * cross_att(out) + out$</p>
<p>첫번째 디코더는 $\alpha=1$로 설정하고 점차 감소한다.</p>
<h2 id="loss-function--implementation-details">Loss Function &amp; Implementation details</h2>
<p>loss function은 classification loss($L_{cls}$)와 smooth loss($L_{smo}$)의 합으로 이루어져있다.</p>
<p>classification은 cross-entropy loss, smooth loss는 frame-wise probabilities의 mean squared error로 계산한다.</p>
<p>$L = L_{cls} + \lambda L_{smo} = \frac{1}{T}\sum_t-log(y_{t,\hat{c}}) + \lambda\frac{1}{TC}\sum_{t}\sum_{c}(y_{t-1,c}-y_{t,c})^2$</p>
<p>$y_{t,\hat{c}}$: predicted probability for the groung truth label $\hat{c}$ at time $t$</p>
<p>$\lambda$:  논문에서는 0.25로 설정</p>
<p>final ASFormer는 1개의 인코더와 3개의 디코더로 구성되어있으며,</p>
<p>인코더와 디코더는 각각 9개의 블럭을 갖고있다.</p>
<p>차원 셋팅을 위한 각 첫번째 fc layer는 64 dimension으로 설정한다</p>
<p>그리고 논문에서는 dropout rate을 0.3으로 인코더의 input feature에 dropout을 적용했다. 120epoch를 adam optimizer로 lr 0.0005로 훈련시켰다.</p>
<h1 id="experiments">Experiments</h1>
<h2 id="impact-of-position-encoding-and-multi-head-self-attention">Impact of position encoding and multi-head self-attention</h2>
<p>구현에서 vanilla transformer와 다른 점이 2가지 있다.</p>
<ol>
<li>position encoding X</li>
<li>multi-head attention X, 각 인코더 디코더 블럭에 single-head attention 사용</li>
</ol>
<p>실험1 : position encoding이 ASFormer에 필요한가 아닌가</p>
<p>아래 표는 50Salads dataset의 결과이다. 확실히 성능이 떨어지는 것을 볼 수 있다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/46bed167-7d6d-4f9a-bdf8-f7386d5e6ec5/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_3.17.13.png" alt=""></p>
<p>→ 가능성있는 근거로는 temporal conv에서 이미 모델의 상대적인 relationships을 가질 수 있기 때문이다. 그러므로 absolute한 position encoding은 필요없으며 오히려 방해가 된다.</p>
<p>실험2 : multi-head self-attention의 영향력</p>
<p><img src="https://images.velog.io/images/bo-lim/post/642b4e8a-f2a9-470e-ab0e-acf019a8cee1/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_3.22.06.png" alt=""></p>
<p>single head와 다른 multi heads와 성능차이가 거의 없다.</p>
<p>→ convolution operation은 multi-head self-attention operation과 비슷하기 때문이다. </p>
<p>결론적으로 computation, memory budgets를 고려하여 single-head self-attention을 default로 사용한다.</p>
<h2 id="effect-of-the-local-connective-inductive-bias">Effect of the local connective inductive bias</h2>
<p>이번에는 local connective inductive bias의 효과에 대해 살펴본다.</p>
<p>vanilla transformer와 같이 feed-forward layer로 사용되는 MLP와 비교하였다.</p>
<p>temporal conv를 없애려면 vanilla transformer처럼 position encoding이 필요하다. </p>
<p>먼저 refinement 과정의 영향력을 제외하기 위해 인코더 부분에서만 사용해보았다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/fc93fb8d-8653-4793-b5cb-8fb260bbbdee/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_3.34.32.png" alt=""></p>
<p>성능이 크게 줄어드는 것을 확인할 수 있다. 특히 F1 score와 edit이 많이 떨어지는데 이는 모델이 frame들 사이에서 temporal relationship을 알아내지 못한 것을 의미한다.</p>
<h2 id="effect-of-the-hierarchical-representation-pattern">Effect of the hierarchical representation pattern</h2>
<p>ASFormer의 hierarchical representation pattern은 중요한 역할을 한다. 이를 보여주기 위해 계층구조가 아닌 모든 attention layer의 local window사이즈를 512로 맞춘 모델을 준비했다. 여기서 512는 마지막 인코더, 디코더 블록에서 메모리 용량을 고려한 가장 큰 window size이다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/45a78eef-3cab-4bba-bd3c-5edf3600cc7a/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_3.44.51.png" alt=""></p>
<p>확실한 성능 저하가 보인다.</p>
<p>→ 왜 이러한 성능 차이가 나는 지 더 잘 이해하기 위해 아래 그림을 첨부하였다. 아래 그림은 각 인코더의 self-attnetion 레이어의 attention weights를 그린 것이다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/075c0ebe-fdfb-4299-8467-fcff3b4a0b18/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_3.51.49.png" alt=""></p>
<ul>
<li><p>비계층 버전이 high-level 블럭에서 더 많은 활동이 있다. 이것은 attention weights가 더 많은 위치에서 더 가까운 값과 더 비슷한 사소한 균일 분포를 가진다는 것을 의미한다.</p>
<p>  반대로 계층 버전에서는 몇몇 의미있는 위치에 집중한다.</p>
</li>
<li><p>‘freely’ attention 은 스스로 계층적인 패턴을 데이터에서 학습하지 못한다는 것을 볼 수 있다. self-attention layer가 자유로울때 low-level 블럭들은 주위 이웃들에게 집중을 하지 않는다는 것을 위의 이미지에서 볼 수 있다.</p>
</li>
</ul>
<h2 id="effect-of-the-multiple-decoders">Effect of the multiple decoders</h2>
<p>이번에는 디코더가 가져오는 이점을 보여주기 위해 디코더 개수를 다르게 하여 연구하였다. 인코더와 비교하여 디코더가 성능이 크게 변하였다.</p>
<p>논문에서는 3개의 디코더를 쌓았을 때 성능이 가장 좋았다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/7529fc22-4360-4850-83ab-816d184333c8/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_4.05.31.png" alt=""></p>
<h2 id="ablations-of-the-number-of-blocks">Ablations of the number of blocks</h2>
<p>블럭 개수를 정하는 하이퍼파라미터는 더 넣은 receptive fields와 더 높은 메모리 비용을 발생시키기 때문에 중요하다.</p>
<p>그래서 블럭 개수를 다르게 하여 실험을 진행하였다.</p>
<p>블럭(J)가 9일때 가장 성능이 좋았다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/f04fb7ab-4e79-4c4a-aa8c-58321aca8645/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_4.09.05.png" alt=""></p>
<h2 id="comparison-with-sota">Comparison with SOTA</h2>
<p><img src="https://images.velog.io/images/bo-lim/post/0e6be37f-1b77-4be2-8de4-5adf4f3658c7/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2022-02-26_%EC%98%A4%ED%9B%84_4.11.50.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL(Today I Learned) - 2월 넷째 주]]></title>
            <link>https://velog.io/@bo-lim/TILToday-I-Learned-2%EC%9B%94-%EB%84%B7%EC%A7%B8-%EC%A3%BC</link>
            <guid>https://velog.io/@bo-lim/TILToday-I-Learned-2%EC%9B%94-%EB%84%B7%EC%A7%B8-%EC%A3%BC</guid>
            <pubDate>Tue, 22 Feb 2022 14:14:12 GMT</pubDate>
            <description><![CDATA[<h2 id="0222-tue">02.22 (Tue.)</h2>
<h3 id="boostcamp">Boostcamp</h3>
<p>이번 주와 다음 주는 Mask, Age, gender classification이 주제인 competition이 있다. 그래서 그런지 강의도 이전에 배운 내용을 컴피티션을 위한 내용을 중점적으로 나온 듯 했다.</p>
<p>강의는 수월하게 들을 수 있었다.</p>
<p>competition을 위한 gpu를 할당받아봤는데 vs-code로 연결하려니 자꾸 password를 입력하라고 뜬다. 아무래도 key 경로가 틀렸던지 하는 것 같은데 내일 해결해봐야겠다.</p>
<h3 id="연구실">연구실</h3>
<p>학회 gpu 있어서 따로 연구실 gpu 안쓰고 있었는데 이제 학회도 끝나서 금요일에 연구실 gpu를 받고 싶다고 교수님께 말씀드렸다.</p>
<p>아직 gpu 할당을 못받아서 2020년에 나온 ms-tcn++를 기존 프로젝트에 붙였다. 
저자가 같아서 그런지 코드 구조도 ms-tcn과 비슷해서 쉽게 추가할 수 있었다.</p>
<h2 id="0222">02.22</h2>
<p>오늘은 그냥 tmi로 머리 잘랐다. 거의 매직하고 자르고의 반복이었는데 이번에 처음으로 레이어드컷으로 잘랐다.
너무 마음에 드는데 머리 감고 나서도 예쁠지 의문이다.ㅎ</p>
<h3 id="boostcamp-1">Boostcamp</h3>
<p>오늘도 나머지 강의 모두 듣고 서버 연결했다.
vs-code보다 파이참 연결이 더 쉽다고 하길래 우선 파이참 먼저 서버 연결을 했다.</p>
<p>기존 서버에도 데이터셋이 올라가있는데 데이터셋이 들어있는 내 로컬 폴더와 동기화하다가 메모리 경고가 떴다...
그래서 그냥 빈 로컬폴더와 데이터셋 있는 서버 내 폴더와 동기화했다.</p>
<h3 id="연구실-1">연구실</h3>
<p>gpu 메일이 와서 여기서도 서버 연결을 했다.</p>
<p>iTerm2와 파일질라를 다운받아서 연결을 하는데
잘못할까봐 무서웠다😱</p>
<p>서버 연결만 하고 gpu 사용은 안해봤는데
무사히 잘 되었으면 좋겠다ㅎㅎㅎ</p>
<h3 id="cs231n">CS231n</h3>
<p>내일 스터디있기 때문에 부랴부랴 11강과 12강을 보았다. 사실 아직 12강은 다 못봤는데 자기 전에 다 보려고 한다.
11강은 Detection &amp; Segmentation, 12강은 Visualizing and Understanding이 제목이다.</p>
<p>R-cnn, Faster r-cnn등 여러 논문들을 읽었던 것 같은데
사실 조금 까먹은 것 같다...ㅎㅎㅎ
이번 기회에 다시 기억을 살릴 수 있어서 다행이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker Compose | 여러 컨테이너 관리하기]]></title>
            <link>https://velog.io/@bo-lim/Docker-Compose-%EC%97%AC%EB%9F%AC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bo-lim/Docker-Compose-%EC%97%AC%EB%9F%AC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 19 Feb 2022 09:02:31 GMT</pubDate>
            <description><![CDATA[<h1 id="docker-compose">Docker Compose</h1>
<p>이번 포스팅은 도커 컴포즈에 관한 내용이다.
멘토님이 실제 서비스에서는 여러 컨테이너를 띄우기 때문에
docker compose 공부를 추천해주셨다!👍</p>
<h2 id="docker-compose란">docker compose란</h2>
<p>Docker compose는
compose 파일로 여러 컨테이너를 관리하기 쉽게 해주는 기능이다.</p>
<p>아래 실습 내용들은 도커의 <a href="https://docs.docker.com/compose/gettingstarted/">공식 document</a>를 따라 실습 후, 작성하였다.</p>
<h2 id="installation">installation</h2>
<p>우선 나는 Docker desktop을 설치하였다.</p>
<p>이 경우 docker-compose는 설치되어있으며,
터미널에</p>
<pre><code>docker-compose</code></pre><p>입력 시 아래 결과로 설치되어있음을 확인할 수 있다.</p>
<p><img src="https://images.velog.io/images/bo-lim/post/f6dc64b8-a94a-43de-a0a9-34b125d75bcb/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-19%20%EC%98%A4%ED%9B%84%205.32.02.png" alt=""></p>
<h2 id="apppy">app.py</h2>
<p>다음은 redis와 flask를 이용한 간단한 웹페이지 작성이다.</p>
<p>get_hit_count 함수로 페이지가 갱신될 때 마다
값을 1 증가시키며 반환한다.</p>
<p>가장 기본 path인 <del>/ 로 접근할 경우 hello 함수가 작동하며
get_hit_count에서 받아온 값을
Hello Wordl!</del> ~times. 사이에 넣어서 보여준다.
<img src="https://images.velog.io/images/bo-lim/post/7a748549-7eac-4f7a-bd8e-e05f0f056b2c/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-19%20%EC%98%A4%ED%9B%84%205.38.35.png" alt=""></p>
<h2 id="requirementstxt">requirements.txt</h2>
<p>그 다음 redis와 flask는 docker 안에서 따로 설치가 필요하기 때문에 작성해준다.</p>
<pre><code>flask
redis</code></pre><h2 id="dockerfile">Dockerfile</h2>
<p>이번에는 Dockerfile을 작성한다.</p>
<pre><code># syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD [&quot;flask&quot;,&quot;run&quot;]</code></pre><ul>
<li>Python 3.7 image에서 시작한다.</li>
<li>working directory 를 /code로 설정한다.</li>
<li>flask를 위한 환경설정을 한다.</li>
<li>gcc등 다른 dependencies를 설치한다.</li>
<li>requirements.txt를 복사하고 이를 설치한다.</li>
<li>EXPOSE로 5000번 포트를 외부에 공개할 예정이라고 알려준다.</li>
<li>현재 디렉토리를 workdir .으로 복사한다.</li>
<li>마지막으로 flask run 로 웹을 실행한다.</li>
</ul>
<h2 id="docker-composeyml">docker-compose.yml</h2>
<p>docker compose를 위한 파일을 작성한다.</p>
<pre><code>version: &quot;3.9&quot;
services:
  web:
    build: .
    ports:
      - &quot;8000:5000&quot;
  redis:
    image: &quot;redis:alpine&quot;</code></pre><h2 id="build-and-run-my-app">Build and run my app</h2>
<p>터미널에서</p>
<pre><code>docker-compose up</code></pre><p>을 실행한다.</p>
<p>그리고 localhost:8000을 확인한다.
<img src="https://images.velog.io/images/bo-lim/post/e2a6f73c-4440-4ac0-b9c5-e7574c2a0fd2/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-19%20%EC%98%A4%ED%9B%84%205.02.02.png" alt=""></p>
<p>새로고침하면 숫자가 계속해서 늘어나는 것을 확인할 수 있다.</p>
<p>내릴 때는</p>
<pre><code>docker-compose down</code></pre><p>를 입력한다.</p>
<p>그리고 image를 확인하면 
여러 이미지가 생성된 것을 볼 수 있다.</p>
<pre><code>docker images</code></pre><p><img src="https://images.velog.io/images/bo-lim/post/069a23a7-a215-4ca3-b545-be19dd4cfe43/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-19%20%EC%98%A4%ED%9B%84%205.52.20.png" alt=""></p>
<h2 id="edit-the-compose-file">Edit the compose file</h2>
<p>이번에는 bind mount를 추가하려고 한다.</p>
<p>docker-compose.yml에 volumes와 environment를 추가한다.</p>
<pre><code>version: &quot;3.9&quot;
services:
  web:
    build: .
    ports:
      - &quot;8000:5000&quot;
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: &quot;redis:alpine&quot;</code></pre><ul>
<li>volumnes로 현재 프로젝트 디렉토리를 host의 /code안 컨테이너에 마운트한다.
그러면 코드를 수정해도 이미지를 rebuild 할 필요가 없다.<h2 id="re-build-and-run-the-app">Re-build and run the app</h2>
위에서 했던 것처럼 다시<pre><code>docker-compose up</code></pre>를 입력한다.</li>
</ul>
<p>잘 업데이트 되는지 확인하기 위해서 
app.py의 hello function의 return 부분을 아래와 같이 바꿔준다.</p>
<pre><code>return &#39;Hello from Docker! I have been seen {} times.\n&#39;.format(count)</code></pre><p><img src="https://images.velog.io/images/bo-lim/post/80f9bc3f-64ba-4224-a288-562ccd721e59/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-19%20%EC%98%A4%ED%9B%84%205.17.27.png" alt="">
rebuild 없이 잘 변경된 것을 확인할 수 있다.</p>
<h2 id="background-실행">background 실행</h2>
<p>background에서 돌리고 싶으면 -d flag를 추가한다.</p>
<pre><code>docker-compose up -d</code></pre><p>stop 할 때는</p>
<pre><code>docker-compose stop</code></pre><p>down과 함께 volumes 데이터를 삭제하고 싶을 때는</p>
<pre><code>docker-compose down --volumes</code></pre><p>를 입력한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL(Today I Learned) - 2월 셋째 주]]></title>
            <link>https://velog.io/@bo-lim/TILToday-I-Learned-2%EC%9B%94-%EC%85%8B%EC%A7%B8-%EC%A3%BC</link>
            <guid>https://velog.io/@bo-lim/TILToday-I-Learned-2%EC%9B%94-%EC%85%8B%EC%A7%B8-%EC%A3%BC</guid>
            <pubDate>Fri, 18 Feb 2022 11:05:55 GMT</pubDate>
            <description><![CDATA[<h2 id="이번-주-hot-issues">이번 주 Hot Issues</h2>
<h3 id="교환학생-결과">교환학생 결과</h3>
<p>월요일에 2022-2학기 교환학생 결과가 나왔다.
프랑스 Grenoble-Alphes University에 합격이 돼서 신났다ㅎㅎㅎㅎ막상 가려니까 더 일찍 준비시작해서 영어권으로 갈 수 있었으면 좋았을텐데 라는 후회도 들었다ㅠㅠㅠ그래도 바쁜 3학년 2학기랑 토플 공부 병행하면서 열심히 했기 때문에 더 준비를 오래할 걸 이라는 후회는 들어도 당시에 더 열심히 공부할걸이라는 후회는 안들었다.ㅋㅋㅋ</p>
<p>주말에는 영어회화 학원을 다녀볼까 고민 중이다. 아직 어디를 다닐지 고민은 안했는데 그래도 토플 학원보다는 재밌을 것 같아서 설렌다🥰</p>
<h3 id="베이징-올림픽">베이징 올림픽</h3>
<p>우선 일단 베이징 동계올림픽 컬링 너무 재밌다ㅎㅎㅎㅎ
피겨도 너무 예뻐서 보는데 점프 종류가 궁금해서 유튜브 보면서 공부도 했다.</p>
<h2 id="0214">02.14</h2>
<h3 id="부스트캠프">부스트캠프</h3>
<p>머신러닝 프로젝트의 전반적인 순서와 플로우에 대해서 공부하였다.</p>
<h3 id="cv-연구실">CV 연구실</h3>
<p>그리고 연구를 위해 부스트캠프에서 추천해준 pytorch template에 ms-tcn 코드를 붙이고 있는데 
오늘은 train epoch 부분을 수정했다.</p>
<h2 id="0215">02.15</h2>
<h3 id="부스트캠프-1">부스트캠프</h3>
<p>AI 모델 저작권에 대한 강의를 들었는데, 따로 공부하기 힘든 부분이라 너무 유익했다!! 깃허브 MIT license 많던데 이것도 한번 자세히 봐야겠다.</p>
<h3 id="cv-연구실-1">CV 연구실</h3>
<p>오늘은 tcn코드에서 batch_gen 부분과 util 부분을 수정하였다.
tcn은 데이터를 파일 입출력으로 읽어들이고 출력하기 때문에 파이토치의 Dataset, loader로 작성하기 힘들어서 다르게 바꿨다.</p>
<h3 id="cs231n-스터디">CS231n 스터디</h3>
<p>수요일에 CS231n 스터디 10강 스터디 하기 때문에 
10강 듣고 질문 올렸다.
10강은 RNN에 대한 내용이었는데, 얼마전 부스트캠프에서 공부해서 수월하게 넘어갈 수 있었다.</p>
<h2 id="0216">02.16</h2>
<h3 id="부스트캠프-2">부스트캠프</h3>
<p>오늘은 피어세션에서 Transformer 논문 Why self-attention &amp; Training 부분에 대해서 발표해야하기 때문에 읽고 정리하였다.
이 부분에서 BLEU 평가 방법이나 transformer의 learning rate schedule이 특히 인상깊었다.</p>
<p>그리고 도커와 MLflow에 대해 공부하였다.</p>
<p>도커에서 Mac M1칩 때문에 mysql pull 과정에서 워닝이 계속 나와서
지웠다 깔았다를 계속 반복하다 보니까 뒤에 강의에서 배우는 많이 사용된다는 명령어들이 암기가 되었다. 
워닝에 대해서 slack 채널에 남겼는데 많은 분들이 쓰레드 남겨주셔서 이것저것 도전해보았다. 우분투를 안까는 방향으로 모두 시도해봤는데 해결이 안되서 결국 우분투 깔아서 다시 도전해봐야겠다...ㅠㅠ</p>
<p>mlflow는 아직 완전히 PyTorch에 사용가능한게 아니라 PyTorch Lightning에 된다고 해서 아쉽다.😭</p>
<h3 id="boaz">BOAZ</h3>
<p>내일 BOAZ 동아리에서 클로바 폰트생성 모델 <a href="https://github.com/clovaai/fewshot-font-generation">fewshot-font-generation</a> 학습 해오기로 해서 코랩에서 7시간 정도 학습시켰다.
처음에는 Out-Of-Memory 에러가 나서 batch_size와 num_workers를 줄였다. 
8000steps이 돌아가니까 할당된 GPU를 모두써서 멈췄다.
아래는 그 결과이다.
<img src="https://images.velog.io/images/bo-lim/post/076fc134-2781-4e73-b1b5-f66205cd0550/last.png" alt="">
코드를 보니 한참 남아서 내일 회의시간때 코랩 프로 결제하자고 말을 꺼내볼 예정이다!</p>
<h2 id="0217">02.17</h2>
<h3 id="부스트-캠프">부스트 캠프</h3>
<p>피어세션에서 리눅스 강의 과제 중 하나인 
카톡 대화내용 csv로 저장하고 2020년 대화를 많이 한 사람 top3를 뽑는 명렁어를 단 한 줄로 작성하기
를 해보았다.</p>
<p>우리팀 카톡 대화 데이터를 사용해서 2022년 1월로 기준을 바꾸고 진행하였다.</p>
<p>내가 만든 답은
-&gt; 
cat kakaotalk.csv| awk -F, &#39;/2022-01/ {print $2 }&#39; | sort | uniq -c | sort -r | head -n 3</p>
<p>순간 내가 제일 먼저 풀어야지 라는 승부욕이 올라와 시간가는 줄 모르고 했다ㅎㅎㅎㅎ 유치하지만 제일 먼저 풀어서 기분 좋았다😂 (팀원분들이 내 블로그 안보시겠지...?)</p>
<h3 id="cv-연구실-2">CV 연구실</h3>
<p>오늘은 loss function을 수정해주었다. 
action segmentation 논문들은 보면 각자 정의한 loss도 다르고
action segmentation은 과도한 segmentation을 막아주기 위해 loss function을 하나의 loss만 정의하는 것이 아니라 여러 개를 더하면서 정의한다.</p>
<p>내가 지금 구현하고 있는 <strong>ms-tcn</strong>은 
<strong>cross entropy loss</strong>와 <strong>truncated mean squared error over the frame-wise log-probabilities</strong>를 아래처럼 합한다.
<img src="https://images.velog.io/images/bo-lim/post/03121ec4-66c8-4728-bb35-6a30abd913db/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-18%20%EC%98%A4%ED%9B%84%207.48.24.png" width="300">
<img src="https://images.velog.io/images/bo-lim/post/69d2bbe4-c5fa-4eb1-a25d-0746c9b43a53/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-02-18%20%EC%98%A4%ED%9B%84%207.51.54.png" width="300"></p>
<h2 id="0218">02.18</h2>
<h3 id="부스트캠프-3">부스트캠프</h3>
<p>멘토님이 도커란? 에 대해서 쓴 글에 Docker Compose에 대해서 공부하는 것을 추천해주셔서 지금 공부하고 있다. 정리해서 포스팅 도전해볼 생각이다!</p>
<h3 id="cv-연구실-3">CV 연구실</h3>
<p>교수님이랑 미팅하였는데, cuai 학회 이제 그만둬서 gpu가 없다고 말씀드렸다.
그래서 연구실 gpu 할당받고 ms-tcn 돌려보라고 말씀해주셨다.</p>
<p>애매하게 만들어 넘어가지 말고 확실하게 제대로 구현하고 학습해야 나중에 논문 비교에 넣을 수 있다고 조언해주셨다.</p>
<p>이후 계획으로 ms-tcn++랑 
원래 구현 목적인 Yifei Huang의 Improving Action Segmentation via Graph Based Temporal Reasoning 논문의GTRM을 모델을 구현할까 했는데 
Graph based 모델 코드 공부를 작성해본 적이 없어서
MS-tcn++ 먼저 구현해보기로 했다.</p>
<p>추가적으로 action segmentation에 대해 2020년 논문까지 읽었어서 이후 2021년 위주의 논문을 계속해서 읽어볼 예정이다.</p>
<p>논문 읽은 거 정리해서 올리면 좋을 것 같은데 시간이 얼마나 걸릴지...😭</p>
]]></description>
        </item>
    </channel>
</rss>