<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_yoonji99.log</title>
        <link>https://velog.io/</link>
        <description>🖥️</description>
        <lastBuildDate>Sun, 25 Feb 2024 08:28:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>_yoonji99.log</title>
            <url>https://velog.velcdn.com/images/ha_yoonji99/profile/5c9f1600-6c93-4248-adf2-5ec16e82f060/image.avif</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. _yoonji99.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ha_yoonji99" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[논문 리뷰] Masked Autoencoders Are Scalable Vision Learners(CVPR, 2021)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Masked-Autoencoders-Are-Scalable-Vision-LearnersCVPR-2021</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Masked-Autoencoders-Are-Scalable-Vision-LearnersCVPR-2021</guid>
            <pubDate>Sun, 25 Feb 2024 08:28:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li>Mased auto encoders(MAE)가 컴퓨터 비전 분야에서 <strong>scalable self-supervised learners</strong> 임을 증명</li>
<li><strong>아이디어 : 입력 이미지의 패치를 랜덤하게 마스킹한 후 missing pixels를 복원하도록 학습</strong></li>
<li><strong>인코더-디코더 구조는 비대칭 구조.</strong><ul>
<li><strong>인코더</strong>: 마스킹 되지 않은 부분만 처리</li>
<li><strong>디코더</strong>: 인코더보다 훨 가볍게 설정되고 마스킹된 부분과 되지 않은 부분 모두 처리</li>
</ul>
</li>
<li>입력 이미지에 대한 최적 마스킹 비율 : 75%</li>
<li><strong>학습 속도&amp;정확도</strong> 높일 수 있었음</li>
<li>최종적으로 <strong>transfer learning</strong> 성능도 검증</li>
</ul>
<hr>
<h2 id="intro"><strong>Intro</strong></h2>
<p>딥러닝이 핫해지고 하드웨어들이 발전하면서 거대한 모델들이 엄청나게 많은 데이터를 overfit하게 학습하게 되었고 수 백만의 <em>labled</em> 이미지를 필요로 하게 되었다.</p>
<p>NL에서는 autoregressive 언어 모델인 GPT와 masked autoencoding 모델인 BERT가 성공했는데,</p>
<p><strong>매우 simple한 아이디어: 데이터의 일부를 지우고, 지운 내용 예측하도록 모델 학습</strong></p>
<ul>
<li><p><strong>Masked autoencoder</strong></p>
<ul>
<li>Denoising autoencoder의 일부</li>
<li><strong>NLP</strong>에서 성공한다음 <strong>cv</strong>에서도 성공적으로 안착하려고 함</li>
</ul>
</li>
<li><p><strong>NLP와 CV 차이점</strong></p>
<ul>
<li><p>(1) <strong>Architecture가 다르다</strong></p>
<ul>
<li><p><strong>컴퓨터 비전</strong>에서는 일반적으로 CNN을 사용하는데 이는 <strong>NLP</strong>와 다르게 mask token 혹은 positional embedding과 같은 <strong>indicators</strong>가 존재하지 않는다.</p>
<p>  <strong>⇒ 하지만 ViT의 등장으로 어느 정도 해결될 수 있었다.</strong></p>
</li>
</ul>
</li>
<li><p>(2) <strong>Information density가 다르다</strong></p>
<ul>
<li><p><strong>NLP</strong>: highly semantic &amp; information-dense</p>
</li>
<li><p><strong>CV</strong>: sptial redundancy (이웃 패치로부터 missing 패치가 충분히 회복될 수 있음)</p>
</li>
<li><p><em>⇒ 해당 차이점은 높은 비율의 마스킹을 통해 충분히 완화될 수 있다.*</em></p>
</li>
</ul>
</li>
<li><p><strong>(3) Autoencoder의 Decoder가 수행하는 바가 다르다</strong></p>
<ul>
<li><strong>NLP</strong>: missing <em>words</em>를 예측하는 역할. 풍부한 semantic 정보를 포함하여야 함</li>
<li><strong>CV</strong>: <em>Pixels</em>를 재구축하는 역할. 상대적으로 덜 semantic함</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>위와 같은 차이점들을 고려하여 <strong>본 연구는 MAE의 간단하고, 효과적이고, Scalable한 형태로 visual 표현학습을 할 수 있도록 제안한다.</strong></p>
<ul>
<li><p><strong>모델 구조</strong></p>
<ul>
<li><p>모델의 구조는 아래와 같이 <strong>인코더와 디코더가 비대칭적인 형태</strong>를 띈다.</p>
</li>
<li><p><em>인코더*</em>는 <strong>마스크 토큰이 없는 visible한 패치</strong>만 처리하게 되고,</p>
</li>
<li><p><em>디코더*</em>는 훨씬 가벼운 형태로 <strong>마스크 토큰과 함께 latent representation을 사용</strong>하여 재구축하게 된다.
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/0b082238-b671-4ba7-b7f0-1f82682668ab/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p><strong>Contribution</strong></p>
<ul>
<li>마스크 토큰을 디코더에서 활용할지라도 상당히 작은 구조를 띄고 있기 때문에 계산 측면에서 많은 감소가 존재한다.</li>
<li>높은 마스킹 비율은 <strong>인코더가 작은 부분만 처리</strong>할 수 있게 하면서 <strong>정확도 또한 최적화</strong>할 수 있다.</li>
<li><strong>전반적인 transfer learning 시간을 줄이고</strong>, <strong>메모리 소비를 줄여</strong> MAE를 거대 모델에 쉽게 스케일업 할 수 있게 한다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="related-work">Related work</h2>
<ul>
<li><strong>Masked language modeling</strong></li>
</ul>
<p>NLP에서의 성공적인 사전학습 모델인 BERT와 GPT가 대표적이다.</p>
<p>입력 시퀀스의 일부를 지우고, 지워진 부분을 재복원할 수 있도록 학습하는 전략이다.</p>
<ul>
<li><strong>Autoencoding</strong></li>
</ul>
<p>오토인코더는 인코더에서 입력 데이터를 잠재 표현에 매핑하고, 디코더에서 재복원하는 모델이다.</p>
<p><strong>DAE는 입력 신호를 망가뜨리고, 재복원 시에 온전한 신호로 복원하는 방법</strong>이다.</p>
<p>픽셀을 마스킹하는 방법이나 색상 채널을 제거하는 방법이 DAE의 일종이라고 볼 수 있다.</p>
<ul>
<li><strong>Masked image encoding</strong></li>
</ul>
<p><strong>마스킹에 의해 망가뜨려진 이미지로부터 표현을 추출</strong>하는 방법이다.</p>
<p>DAE에서의 노이즈의 일부로 마스킹을 보는 것이다.</p>
<p>초기 연구로는 iGPT, BEiT 등이 있다.</p>
<ul>
<li><strong>Self-supervised learning</strong></li>
</ul>
<p>사전학습을 위해 여러 pretext task 집중하는 방법이다.</p>
<p>최근에는 대조학습이 제일 유명하긴 한데 이는 data augmentation에 너무 의존한다는 단점이 있다.</p>
<p>오토인코더를 활용하는 것은 개념적으로 다른 방향을 추구하는 것이고, 제시하고자 하는 행동 또한 다르다.</p>
<hr>
<h2 id="approach"><strong>Approach</strong></h2>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a401836c-b0e5-4d88-a5d8-e297729e1bbe/image.png" alt=""></p>
<p>모델의 구조는 앞서 계속 언급했듯, 오토인코더의 형태를 띈다.</p>
<p>인코더는 입력 데이터를 잠재 표현으로 매핑하고, 디코더는 잠재 표현으로부터 입력 데이터를 복원한다.</p>
<p>하지만 일반적인 오토인코더와는 다르게, MAE의 <strong>인코더는 마스킹이 되지 않은 부분만을 입력</strong>으로 사용하고, <strong>디코더는 마스크 토큰과 잠재 표현 모두를 사용해서 입력 신호를 복원</strong>한다.</p>
<p>그리고 디코더는 인코더보다 <strong>훨씬 가벼운 형태</strong>를 띈다.</p>
<ul>
<li><p><strong>Masking</strong></p>
<ul>
<li><p>ViT를 따르기 때문에, 이미지를 안 겹치는 패치로 자른다.</p>
<p>  그 후 <strong>비복원추출</strong>로 랜덤하게 마스킹할 패치를 선택한다. 이 때 랜덤하게 선택할 확률은 <strong>Uniform 분포</strong>를 따르도록 한다. <strong>Center bias를 방지</strong>하기 위해서다.</p>
<p>  마스킹 비율을 높게 가져가서 중복을 상당히 많이 제거한다. 그래서 visible 이웃 패치로부터의 외삽으로 주변이 쉽게 예측되지 않도록 한다.</p>
</li>
</ul>
</li>
<li><p><strong>MAE encoder</strong></p>
<ul>
<li>마스킹되지 않은 25% 정도의 visible 패치만 사용하기 때문에 아무리 큰 ViT 인코더를 써도 속도가 상당히 빠르다.</li>
</ul>
</li>
<li><p><strong>MAE decoder</strong></p>
<ul>
<li><p>디코더는 <strong>visible 패치와 mask token 모두를 입력</strong>으로 받는다.</p>
<p>  그리고 꼭 positional embedding을 추가해줘야 하는데, 없으면 mask token이 아무 정보를 못 갖게 된다.</p>
<p>  디코더는 이미지 복원 작업을 수행하는 <strong>사전학습</strong> 시에만 사용되기 때문에, Flexible하게 구성하면 된다.</p>
<p>  인코더 구성과 <strong>독립적</strong>으로 만들면 되기 때문에 <strong>비대칭적으로 가볍고, 좁은 네트워크</strong>로 구성해도 된다.</p>
<p>  실제 논문에서는 토큰 별로 인코더보다 디코더에서 1/10 속도로 처리 가능하도록 했다.</p>
</li>
</ul>
</li>
<li><p><strong>Reconstruction target</strong></p>
<ul>
<li><p>MAE는 masked 패치의 픽셀들을 예측함으로써 입력 데이터를 복원한다.</p>
<p>  <strong>디코더의 출력</strong>은 <strong>픽셀 벡터</strong>들이다. 출력한 후에는 reshape을 통해 원본 이미지 형태로 변환된다.</p>
<p>  손실 함수는 <strong>MSE</strong>를 사용하며, <strong>오직 masked 패치에서만</strong> 손실 함수가 계산된다.</p>
<p>  추가로 Reconstruction target을 <strong>정규화된 픽셀 값</strong>으로 사용하기도 하는데, 그렇게 한다면 <strong>표현 품질이 향상</strong>된다.</p>
</li>
</ul>
</li>
<li><p><strong>Simple implementation</strong></p>
<ul>
<li><p>샘플링 시에 어떠한 sparse operation이 필요없기 때문에 상당히 효율적이다.</p>
<p>  그저 positional embedding으로 각 패치별로 순서 부여하고, 랜덤하게 셔플하고, 뒤에서부터 마스킹 비율에 맞게 제거하는게 끝이다. 그리고 디코더에서 다시 복원할 때는 원래의 postional embedding에 맞게 세우면 된다.</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="imagenet-experiments"><strong>ImageNet Experiments</strong></h2>
<p>사전학습은 ImageNet-1K 데이터셋을 사용했다.</p>
<p>Baseline 모델은 ViT-Large를 사용했는데, 이는 굉장히 크기 때문에 오버피팅 문제가 존재한다.</p>
<p><strong>하지만 제안하는 MAE를 사용하면 지도학습 방식으로 사전학습 시키는 것보다 오버피팅 문제가 적기에 훨씬 성능이 좋다.</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/c7479b76-3f8b-455e-9d1a-bdbe318241c7/image.png" alt=""></p>
<p>scratch, our impl은 규제 term을 하나 추가해서 성능을 높인 것이다.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/4df3d4fb-5313-4bc2-be94-63cf4d0a8b1d/image.png" alt=""></p>
<p>Ablation study의 시작은 마스킹 비율에 관한 실험으로, 75%가 가장 좋은 성능을 얻음을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/5d4acc3d-60c0-402e-aea6-9f21c069347a/image.png" alt=""></p>
<p>실제 이미지 예시를 살펴봐도 75%를 마스킹했을 시에는 상당히 괜찮게 복원하지만, 이보다 더 많은 비율을 마스킹하면 복원이 힘든 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/a376b337-f11e-45b3-b75e-5185435a28f3/image.png" alt=""></p>
<p>위 표들은 Ablation study의 각 결과들이다.
Decoder depth, width를 보면 그렇게 깊게 혹은 넓게 쌓을 필요가 없음을 알 수 있다.</p>
<p>인코더에서는 masked token을 사용하지 않을 때가 더 좋은 성능에 더 빠른 연산 속도를 보였다.</p>
<p>Reconstruction target을 여러 시나리오로 구성 가능한데, 정규화한 픽셀 값을 복원할 때가 성능이 가장 좋았다.</p>
<p>Data augmentation에 있어서는 꽤나 강건한 것을 알 수 있다.</p>
<p>Mask sampling은 랜덤하게 할 때가 가장 좋았다.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/aed4c930-f6fe-43d0-8b95-30a793e1a2e5/image.png" alt=""></p>
<p>오히려 랜덤하게가 아니라 다른 규칙을 기준으로 하면 많은 부분을 마스킹할 수 없게 되고, 많은 부분을 마스킹하면 왜곡된 결과가 나오는 것을 알 수 있다.
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/87547326-fac7-41cc-ba69-74e52cb5653e/image.png" alt=""></p>
<p>대조학습 모델 MoCo나 지도학습 기반 BEiT 같은 모델을 활용해서 사전학습하는 것보다 MAE가 더 뛰어났다.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a3e4981c-adee-4fb0-bec3-cce39dcc1397/image.png" alt=""></p>
<p>Fine-tuning 할 수록 성능이 더 좋아지긴 하는데, 큰 차이가 없기 때문에 어느 정도는 Freeze 시키고 뒤 쪽만 Fine-tuning하는 것이 더욱 좋은 전략일 것이다.</p>
<hr>
<h2 id="transfer-learning-experiments"><strong>Transfer Learning Experiments</strong></h2>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/fb6eea24-b13b-4744-be91-30ec936f04a5/image.png" alt=""></p>
<p>Semantic segmentation Task에서도 MAE로 사전학습 시켰을 때 mIoU가 가장 좋았다.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/1bd60aee-01fa-4a29-81c9-25ed8b5f99d4/image.png" alt=""></p>
<p>다른 이미지 데이터셋에 대한 분류 실험에서도 MAE가 제일 좋았다.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/9fb105e0-22bf-409f-9b51-6ce5f8c89a7b/image.png" alt=""></p>
<p>Reconstruciton target을 픽셀로 할 것이냐, Token으로 할 것이냐 고민할 수 있는데,</p>
<p>대부분의 전이학습 상황에서 픽셀로 할 때 성능이 더 우수했다.</p>
<hr>
<h2 id="discussion-and-conclusion"><strong>Discussion and Conclusion</strong></h2>
<p>NLP에서 성공적이었던 자기지도학습 방법 BERT를 성공적으로 컴퓨터 비전에 접목시켰다고 할 수 있다.</p>
<p>그치만 논하고자 하는 것은 NLP에서는 결국 Semantic한 단어를 가리게 되는데,
비전에서의 패치가 Semantic하냐는 것이다. 그렇다면 픽셀도 Semantic 한가?
<strong>그래서 사실 Semantic 한 것을 가리려면 객체(Object)를 가리는 것이 더욱 논리적일 것이다.</strong></p>
<p><strong>하지만 그러기에는 어려우니까 저자는 높은 마스킹 비율을 사용해서 대부분을 가려버리면 비슷한 효과가 있지 않을까 주장하는 것이다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 11726번 2xn 타일링 - 파이썬(Python)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%B0%B1%EC%A4%80-11726%EB%B2%88-2xn-%ED%83%80%EC%9D%BC%EB%A7%81-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%B0%B1%EC%A4%80-11726%EB%B2%88-2xn-%ED%83%80%EC%9D%BC%EB%A7%81-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython</guid>
            <pubDate>Thu, 17 Aug 2023 03:18:07 GMT</pubDate>
            <description><![CDATA[<h3 id="🗒️-문제">🗒️ 문제</h3>
<p><a href="https://www.acmicpc.net/problem/11726">https://www.acmicpc.net/problem/11726</a>
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/55eb2af2-7229-4579-98de-b1da096c3bd8/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/986af16a-aaf3-4cc5-9de2-4f5800fece5e/image.png" alt=""></p>
<h3 id="🖥️-풀이">🖥️ 풀이</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/1fbdbf92-d8c0-4294-96cf-a9f11851a401/image.png" alt=""></p>
<pre><code class="language-python">#n=1) 1개
#n=2) 2개
#n=3) 3개
#n=4) 5개
#n=5) 8개  --&gt; 피보나치 수열로 풀기.

def fibo(n):
    dp=[0]*(1001)#dp 리스트에 공간확보
    dp[1]=1
    dp[2]=2
    for i in range(3,1001):
        dp[i]=(dp[i-1]+dp[i-2])%10007
    return dp[n]

n=int(input())
print(fibo(n))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1463번 1로 만들기 - 파이썬(Python)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%B0%B1%EC%A4%80-1463%EB%B2%88-1%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%B0%B1%EC%A4%80-1463%EB%B2%88-1%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython</guid>
            <pubDate>Thu, 17 Aug 2023 03:12:24 GMT</pubDate>
            <description><![CDATA[<h3 id="🗒️-문제">🗒️ 문제</h3>
<p><a href="https://www.acmicpc.net/problem/1463">https://www.acmicpc.net/problem/1463</a>
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/3bf8aca5-4269-4d59-84f3-f334f7f881cf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ddb09611-d9df-44bc-b1a5-820fc1c7c1c1/image.png" alt=""></p>
<h3 id="🖥️-풀이">🖥️ 풀이</h3>
<pre><code class="language-python"># 중요포인트: 연산수만 가지고 비교함. 실제 n이 어떻게 줄어들었는지는 고려X
&#39;&#39;&#39;d[2]=1 (2/2)
    d[3]=1 (3/3)
    d[4]=2 (4/2 -&gt; 2/2)
    d[5]=3 (5-1 -&gt; 4/2 -&gt; 2/2)
    d[6]=2 (6/3 -&gt; 2/2) (= 1 + d[6//3])
    d[7]=3 (7-1 -&gt; 6/3 -&gt; 2/2) (= 1 + d[6])&#39;&#39;&#39;

n = int(input())
d = [0] * (n+1)

for i in range(2, n+1):
    d[i] = d[i-1] + 1 # 1 더하는 이유: 기본적으로 연산 한번은 하니까
    if i % 2 == 0:
        d[i] = min(d[i], d[i//2] + 1)# 1 더하는 이유:d리스트는 최소 &quot;연산수&quot; 니까(1을빼면 연산수는+1돼서)
    if i % 3 == 0:
        d[i] = min(d[i], d[i//3] + 1) #위와 동일

print(d[n])</code></pre>
<h3 id="✔️-참조">✔️ 참조</h3>
<p><a href="https://seongonion.tistory.com/40">https://seongonion.tistory.com/40</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Attention Is All You Need (NIPS, 2017)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need-NIPS-2017</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need-NIPS-2017</guid>
            <pubDate>Sun, 13 Aug 2023 05:57:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<h3 id="0-abstract">0. Abstract</h3>
<ul>
<li><strong>Transformer 제안</strong><ul>
<li>RNN, CNN모두 생략</li>
<li>오로지 어텐션 기반</li>
<li>병렬적으로 작동이 가능해서 학습 속도가 빨랐음</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="1-introduction">1. Introduction</h3>
<ul>
<li><strong>RNN기반 모델들은 그동안 대표적인 시퀀스 모델링, 시퀀스 변환모델</strong><ul>
<li>언어모델, 인코더-디코더 구조의 경계를 넓히려고 많이 노력했음</li>
</ul>
</li>
<li><strong>문제점) RNN기반 모델의 본질적인 순서 위치는 긴 시퀀스에서 치명적 (병렬적으로 작동X)</strong><ul>
<li>계산적 발전 이루었음에도 제약 여전히 발생</li>
</ul>
</li>
<li><strong>어텐션: input과 ouput시퀀스의 길이와 상관없이 다양한 task에서 시퀀스 모델링과 시퀀스 변환에서 짱됨</strong><ul>
<li>일부 RNN은 어텐션과 함께 쓰이기도 함</li>
</ul>
</li>
<li><strong>Transformer제안:  recurrent한 특징 제외하고, 어텐션 통해 입력과 출력 사이에 종속성 유지</strong><ul>
<li>병렬화 가능</li>
<li>짧은 학습 시간으로도 번역의 질 향상 가능</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="2-background">2. Background</h3>
<ul>
<li><strong>시퀀스 계산 줄이는 방법: CNN방법 사용(<em>Extended Neural GPU,ByteNet ,ConvS2S )</em></strong><ul>
<li>병렬적으로 모든 입력과 출력 위치들 계산</li>
<li>한계 존재) 필요 연산량이 위치간 거리에 따라 증가(=먼 위치 간의 의존성 학습 어렵게 만듦)</li>
</ul>
</li>
<li><strong>Transformer에서 위 문제 해결</strong><ul>
<li>어텐션 가중치 평균화 → 유효한 해상도 줄임 (multi-head attention으로 해결)</li>
<li>순서 기반 RNN 안씀</li>
</ul>
</li>
<li><strong>Self-attention</strong><ul>
<li>시퀀스의 서로 다른 위치 간의 관계 연관시켜서 시퀀스의 표현 계산</li>
<li>읽기 해석, 요약 등으로 성공적으로 쓰임</li>
</ul>
</li>
<li><strong>Recurrent-attention</strong><ul>
<li>End-to-end memory에서 사용, 순서대로의 recurrence X</li>
<li>간단한 질문에 대답 잘함</li>
<li>=⇒ 그치만 Transformer가 얘보다 더 낫다.(순서 기반 RNN 안씀)</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="3-model-architecture">3. Model Architecture</h3>
<ul>
<li><strong>Transformer 특징</strong><ul>
<li>한번에 하나씩, 각 step은 자동 회귀적, 다음에 생성되는거는 이전꺼도 반영</li>
<li>stack of self attention, point-wise, 인코더 디코더에 모두 fully connected layer
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/a575a729-7a9a-4f81-b4e4-d0fe553e7490/image.png" alt=""></li>
</ul>
</li>
</ul>
<h4 id="3-1-encoder-and-decoder-stacks">3-1. Encoder and Decoder Stacks</h4>
<ul>
<li><strong>인코더 특징</strong><ul>
<li>6개의 identical layer<ul>
<li>각 layer에는 2개의 sub layer<ul>
<li>1번째: multi-head self attention</li>
<li>2번째: position wise fully connected feed forward network</li>
</ul>
</li>
</ul>
</li>
<li>residual connection (2개의 sub layer 사이)<ul>
<li>sub layer결과(embedding layer포함) = layer norm, 512차원 출력</li>
</ul>
</li>
<li>layer norm</li>
</ul>
</li>
<li><strong>디코더 특징</strong><ul>
<li>6개의 identical layer<ul>
<li>각 layer에는 2개의 sub layer<ul>
<li>mask attention: 미래 정보 참조 못하게 하기 위해 mask씌움</li>
</ul>
</li>
</ul>
</li>
<li>residual connection</li>
<li>layer norm</li>
</ul>
</li>
</ul>
<h4 id="3-2-attention">3-2. Attention</h4>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/2168aa76-9d58-40d9-884e-ee02017ac123/image.png" alt=""></p>
<ul>
<li>요소<ul>
<li>쿼리, 키, 벨류</li>
</ul>
</li>
<li>output<ul>
<li>weighted sum of the values (유사성 함수를 통해 계산된 가중치)</li>
</ul>
</li>
</ul>
<h5 id="3-2-1-scaled-dot-product-attention">3-2-1. Scaled Dot-Product Attention</h5>
<ul>
<li>Scaled dot-product<ul>
<li>그냥 dot product 하는 것 보다 scale 시 더 가벼워짐</li>
<li>유사도 값이 너무 크면 softmax가 saturate되고, gradient vanishing되기 때문</li>
</ul>
</li>
<li>dot-product<ul>
<li>scaled와 비슷, sqrt(D_Q) 만 뺌</li>
<li>더 빠르고, 공간 효율적일수있지만, 많은 연산 코드 필요</li>
</ul>
</li>
<li>additive attention<ul>
<li>하나의 hidden layer가지고 feed forward network</li>
<li>더 작은 데이터에 유리</li>
</ul>
</li>
</ul>
<h5 id="3-2-2-multi-head-attention">3-2-2. Multi-Head Attention</h5>
<ul>
<li>single attention보다 multi attention이 더 성능 좋은걸 알아냄</li>
<li><strong>병렬, 동시적</strong>으로 각 attention 계산</li>
</ul>
<p>⇒ <strong>동시적으로 각기 다른 subspace의 각기 다른 위치에서 계산</strong></p>
<h5 id="3-2-3-applications-of-attention-in-our-model">3-2-3. Applications of Attention in our Model</h5>
<ul>
<li>3가지 방법으로 우리 모델에서 attention 사용<ul>
<li>encoder-decoder attention: 쿼리: 이전 디코더 레이어로부터, key&amp;value: 인코더의 output</li>
<li>encoder의 self-attention: 키 쿼리 벨류 모두 인코더의 input으로 부터</li>
<li>디코더의 self-attention: 미래 정보 masking하기</li>
</ul>
</li>
</ul>
<h4 id="3-3-position-wise-feed-forward-networks">3-3. Position-wise Feed-Forward Networks</h4>
<ul>
<li><strong>fully connected feed forward network</strong><ul>
<li>각 위치에 대해 분리되게 적용 가능</li>
<li>2개의 선형 변환이 있었기에 가능 (relu 활성화 함수사용)</li>
</ul>
</li>
</ul>
<h4 id="3-4-embeddings-and-softmax">3-4. Embeddings and Softmax</h4>
<ul>
<li><strong>동일 W가중치를 임베딩 레이어마다, softmax이전에 사용</strong></li>
<li><strong>임베딩</strong><ul>
<li>input token전환 &amp; output token을 벡터로</li>
</ul>
</li>
<li><strong>softmax</strong><ul>
<li>디코더의 output을 확률적으로 바꾸려고</li>
</ul>
</li>
</ul>
<h4 id="3-5-positional-encoding">3-5. Positional Encoding</h4>
<ul>
<li><strong>positional encoding</strong><ul>
<li>embedding과 같은 차원 (이 두개가 더해질수있어야해서)</li>
<li><strong>다양한 방</strong><ul>
<li><strong>여기선 사인, 코사인 함수 사용</strong><ul>
<li>상대적인 위치에 따라 모델이 쉽게 학습할 수 있도록 하기 위해</li>
<li>어떤 고정된 오프셋 k에 대해서든 P Epos+k는 P Epos의 선형 함수로 표현될 수 있기 때문</li>
<li>더 긴 시퀀스 길이로 외삽(extrapolate)할 수 있을 것</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="4-why-self-attention">4. Why Self-Attention</h3>
<ul>
<li><strong>3가지 요구사항 기반으로 self attention 활용</strong><ul>
<li>레이어당 총 연산비용</li>
<li>동시성 있는 연산 (적은 연산으로)</li>
<li>장거리 의존성 간의 경로 길이<ul>
<li>종속성을 학습하는 능력에 영향을 미치는 주요 요소 중 하나는 신호가 네트워크 내에서 이동해야 하는 경로의 길이</li>
<li>많은 시퀀스 변환 task에서 자주 요구되는 사항</li>
<li>다른 레이어 유형으로 구성된 네트워크에서 임의의 두 입력 및 출력 위치 간의 최대 경로 길이를 비교</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="5-training">5 Training</h3>
<h4 id="5-1-training-data-and-batching">5-1. Training Data and Batching</h4>
<p>데이터: standard WMT 2014 English-German dataset </p>
<h4 id="5-2-hardware-and-schedule">5-2. Hardware and Schedule</h4>
<h4 id="5-3-optimizer">5-3. Optimizer</h4>
<p>Adam</p>
<h4 id="5-4-regularization">5-4. Regularization</h4>
<ul>
<li>Residual Dropout<ul>
<li>output of each sub-layer,</li>
<li>ums of the embeddings and the positional encodings in both the encoder and decoder stacks</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] A PCB Dataset for Defects Detection and Classification]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-A-PCB-Dataset-for-Defects-Detection-and-Classification</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-A-PCB-Dataset-for-Defects-Detection-and-Classification</guid>
            <pubDate>Sat, 12 Aug 2023 06:19:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<h3 id="전처리">전처리</h3>
<ul>
<li><p><strong>PCB특징 추출 및 transform test image</strong></p>
<ul>
<li><p><strong>SURF(이걸로)</strong></p>
<ul>
<li>Scale Invariant Feature Transform (SIFT) 알고리즘의 개선된 버전으로, 계산 복잡성이 적고 SIFT에 비해 빠르게 실행</li>
<li>SURF와 SIFT로 선택된 특징점은 모두 안정적이며 회전, 스케일, 밝기에 불변</li>
</ul>
</li>
<li><p><strong>SIFT</strong></p>
<ul>
<li>SIFT는 스케일과 회전 변환에 있어서 더 나은 매칭 효과를 가지지만, 밝기 변화에 있어서는 SURF가 더 나은 매칭 효과를 가지므로, 실제 응용 시나리오를 고려하여 PCB 등록에는 SURF가 선택</li>
</ul>
<p>⇒ 템플릿과 테스트 이미지의 SURF 특징점을 얻은 후, </p>
<p>매칭 포인트를 통해 2차원 기하학적 변환을 추정하고, </p>
<p>테스트 이미지를 기하학적 변환으로 회복</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/4cb845aa-912f-4877-a065-b9bfefc9650c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>이진화</strong></p>
<p>  : 바이너리 맵을 사용하면 PCB의 윤곽과 모양을 흑백으로만 표현하여 비교하기가 더 편리합니다. </p>
<p>  : 그레이스케일 이미지를 이진 이미지로 변환하여 결함의 위치를 얻는 것</p>
<ul>
<li><strong>이진화 방법</strong><ul>
<li><strong>적응적 임계값 분할 알고리즘</strong>
  : 전역 값으로 임계값을 사용하는 대신 이미지의 작은 영역에 대해 임계값을 계산합니다. PCB 이미지는 다양한 영역에서 다른 조명 조건을 가질 수 있기 때문
 <img src="https://velog.velcdn.com/images/ha_yoonji99/post/8e0c753d-de95-4cfe-a27f-8bca78e07a6e/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>       - **결함의 위치 찾기**

        : 결함의 위치를 찾기 위해 먼저 템플릿과 테스트 이미지의 XOR 이진 이미지를 얻습니다.

        dst(I) = src1(I) ⊕ src2(I)

        여기서 dst(I)는 결과 이진 이미지이고, src1(I), src2(I)는 각각 템플릿과 테스트의 이진 맵입니다. XOR 연산은 템플릿과 테스트 이미지의 해당 위치의 픽셀 값이 동일한 경우, 결과 이미지에서 해당 위치의 픽셀 값이 1이 되며, 그렇지 않은 경우에는 0이 됩니다.

        - **가짜 결함 걸러내기**

            : 많은 노이즈와 원치 않는 가짜 결함이 포함될 수 있습니다. 실제 결함을 얻기 위해 **중앙값 필터링과 수학적 형태학 처리**를 사용합니다. 

            - **중앙값 필터링**

                : 이미지의 작은 노이즈 점을 제거하는 비선형 필터링 기술입니다. 

                : 기본 아이디어는 픽셀 점 (x, y)의 이웃 픽셀 값들을 정렬한 후 중간 값으로 원래 픽셀의 값을 대체하는 것

            - **수학적 형태학 처리**

                : 기하학적 구조의 분석과 처리를 위한 이론과 기법으로, 기본 형태학 연산자로는 침식, 팽창, 개방, 폐쇄가 있음.
                침식 (Erosion):
                A ⨁ B = {z | Bz ⊆ A}
                팽창 (Dilation):
                A ⊕ B =  z | (B)z ∩ A 6= ∅
                개방 (Opening):
                A ◦ B = (A ⨁ B) ⊕ B
                폐쇄 (Closing):
                A • B = (A ⊕ B) ⨁ B


        *본 논문에서는 XOR 연산의 결과 이미지를 먼저 5×5 커널로 필터링하여 작은 독립 점을 제거하고, 15×15 직사각형 요소로 클로징 연산을 수행하여 결함의 지역 부분을 연결하고 강화*

        *→ 3×3 직사각형 요소로 개방 연산을 수행.* 

        *→ 이진 이미지에서 주요 객체가 강조되고 연속적으로 클로징과 개방 연산을 수행함으로써 **결함의 위치를 찾습니다.***


    너무 작은 점을 제거하기 위해 면적 임계값을 설정하고, 인접한 중복 후보 영역을 제거하기 위해 **비 최대값 억제(NMS)**를 설정

    결론) **참조 비교 기반 방법**을 기반으로 하여, 우리는 결함을 분류하기 위해 **엔드-투-엔드 컨볼루션 신경망 모델**을 소개했습니다. 이 모델은 상대적으로 적은 레이어로 높은 정확도를 달성하기 위해 **Densenet**에서 영감을 받은 밀집한 **단축 경로(dense shortcuts)**를 사용합니다. 이 모델은 우리의 데이터셋에서 높은 성능을 달성했습니다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] ONLINE PCB DEFECT DETECTOR ON A NEW PCB DEFECT DATASET (2019)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-ONLINE-PCB-DEFECT-DETECTOR-ON-A-NEW-PCB-DEFECT-DATASET-2019</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-ONLINE-PCB-DEFECT-DETECTOR-ON-A-NEW-PCB-DEFECT-DATASET-2019</guid>
            <pubDate>Sat, 12 Aug 2023 06:16:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<h3 id="0-요약">0. 요약</h3>
<ol>
<li><strong>데이터셋</strong></li>
</ol>
<p><strong>DeepPCB</strong> :6가지 유형의 PCB 결함의 위치와 클래스에 대한 1,500개의 템플릿과 테스트 이미지 쌍을 포함(대부분 다 이걸로 사용하는듯)
ㄴ 장점: 정렬 - 템플릿 이미지와 테스트 이미지는 템플릿 매칭 방법을 사용하여 정렬되므로 이미지 전처리에 큰 노력을 줄임
2. <strong>deep model PCB결함 감지기의 딜레마</strong>
정확도와 효율성 사이에서 딜레마에 직면합니다. 높은 정확도를 위해서는 더 많은 층을 갖는 수십 개 또는 수백 개의 레이어로 더 깊은 모델이 필요합니다. 반면, 높은 효율성을 위해서는 많은 파라미터와 덜 깊은 구조가 필요
3. <strong>위의 딜레마 극복 방법(결함 감지능력 향상)</strong>
<strong>그룹 피라미드 풀링(GPP)</strong>: GPP는 그룹화된 풀링과 업샘플링을 통해 다양한 해상도의 특성을 병합합니다. GPP의 각 그룹은 지역적인 컨텍스트 정보와 훨씬 더 큰 범위의 컨텍스트 정보를 모두 가지며 해당 스케일에서 PCB 결함을 예측</p>
<p><br/><br/></p>
<hr>
<h3 id="1-전반적인-흐름">1. 전반적인 흐름</h3>
<p><strong>네트워크 구조</strong>
(a) 입력 이미지 쌍에서 특징 추출을 위해 컨볼루션 백본과 최대 풀링 연산 사용.
(b) 템플릿 이미지와 테스트 이미지의 특징 차이 계산.
(c) 그룹 피라미드 풀링 모듈을 사용하여 다양한 해상도의 특징 획득.
(d) 각 특징 맵에서 다양한 스케일의 예측 생성.
(e) 예측된 결과에 대해 non-maximum suppression (NMS) 수행하여 최종 예측 결과 얻음.</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/8f210192-1d9f-4608-a121-3b7596229aa8/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="2-실험-결과">2. 실험 결과</h3>
<ul>
<li><p>딥 뉴럴 네트워크 기반의 모델들과 복잡한 이중 단계 모델, 그리고 이미지 처리 기술 기반의 알고리즘에 대해 제안된 모델은 평균 평균 정밀도를 1.0%에서 9.3%로 향상</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/af853cbd-bbd2-4c4a-a06b-89bdfefb2f4d/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>GPP 모듈에서의 Max 풀링이 Average풀링보다 1.5% 더 높은 mAP를 제공하는 것을 보여줌</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/8cb5f569-953e-4762-9525-69afe5916e36/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] PCB-Defect-Detection-using-Deepstream (2022)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PCB-Defect-Detection-using-Deepstream-2022</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PCB-Defect-Detection-using-Deepstream-2022</guid>
            <pubDate>Sat, 12 Aug 2023 06:10:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<ul>
<li><p>The defects include:</p>
<p>Missing hole
Mouse bite
Open circuit
Short circuit
Spurious copper
spur</p>
</li>
</ul>
<h3 id="1-전반적인-흐름-및-특징">1. 전반적인 흐름 및 특징</h3>
<ol>
<li>훈련</li>
<li><strong>YOLOv5</strong>사용</li>
<li>데이터: Roboflow에 호스팅</li>
<li>코드 포함</li>
<li>훈련 결과</li>
<li>NVIDIA DeepStream SDK
: AI 기반 비디오 및 이미지 이해와 다중 센서 처리를 위한 완전한 스트리밍 분석 도구킷을 제공</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] PCB Defect Detection Using Denoising Convolutional Autoencoders (2020)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PCB-Defect-Detection-Using-Denoising-Convolutional-Autoencoders-2020</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PCB-Defect-Detection-Using-Denoising-Convolutional-Autoencoders-2020</guid>
            <pubDate>Sat, 12 Aug 2023 06:07:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<p><br/><br/></p>
<hr>
<h3 id="0-전반적인-흐름">0. 전반적인 흐름</h3>
<p><strong>결함찾기+불량 PCB복구</strong></p>
<ol>
<li><strong>네트워크 구조</strong></li>
<li><strong>결함 탐지</strong> -&gt;입력으로부터 복구된 PCB를 예측
복구시킨다음에, 복구시킨것과 입력의 차이 구해서 불량 판별</li>
<li><strong>구조적 유사성</strong>
더 정확한 차이를 계산하기 위해 구조적 유사성을 활용</li>
<li><strong>특이점</strong><ul>
<li>학습 전 noise추가</li>
<li>normal PCB넣어서 초기가중치 추출 후, 본격 학습</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/1e81151c-ac3b-4c42-bdf1-e8e19c7edba1/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/66a4f99a-a967-4381-97ba-406ad0695bda/image.png" alt=""></p>
<h3 id="1-실험-절차">1. 실험 절차</h3>
<ol>
<li><strong>데이터셋</strong>
DeepPCB 데이터셋을 사용하여 실험을 진행
: 1500개의 불량 PCB와 해당 정상 PCB의 이미지 쌍이 포함되어 있으며, 총 6 종류의 결함을 포함
: 불량과 정상 PCB의 이미지 쌍으로 훈련되었으며, 더 나은 결과를 얻기 위해 불량 PCB에 노이즈를 추가</li>
<li><strong>훈련 절차</strong> (이렇게 해도 ㄱㅊ을지 물어보기)
제안된 노이즈 제거 자기 인코더를 훈련하기 전에,<ol>
<li>먼저 정상적인 PCB만을 사용하여 자기 인코더를 훈련</li>
<li>그런 다음 이 네트워크의 가중치를 제안된 네트워크의 초기 가중치로 사용하여 모델의 정확성을 높임</li>
</ol>
</li>
<li><strong>차이 비교 절차</strong><ul>
<li><strong>출력은 복구된 PCB</strong></li>
<li><strong>입력과 출력 차이 비교</strong>
: 출력을 입력에서 빼면 불량 부분이 위치
: 차이가 임계값보다 크면 입력은 불량으로 간주, 그렇지 않으면 불량이 아닌 것으로 간주</li>
<li><strong>임계값 설정</strong>
: 최적의 임계값을 결정하기 위해 4가지 다른 임계값에 대해 true positive rate recall, precision, selectivity, accuracy 및 F-score를 계산(Table 1처럼)</li>
</ul>
</li>
</ol>
<p><br/><br/></p>
<hr>
<h3 id="2-결과">2. 결과</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/b1241cab-5d7a-414b-92b7-dc2d1ae708cd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[서베이 리뷰] Visual Anomaly Detection for Images: A Survey]]></title>
            <link>https://velog.io/@ha_yoonji99/%EC%84%9C%EB%B2%A0%EC%9D%B4-%EB%A6%AC%EB%B7%B0-Visual-Anomaly-Detection-for-Images-A-Survey</link>
            <guid>https://velog.io/@ha_yoonji99/%EC%84%9C%EB%B2%A0%EC%9D%B4-%EB%A6%AC%EB%B7%B0-Visual-Anomaly-Detection-for-Images-A-Survey</guid>
            <pubDate>Sat, 12 Aug 2023 06:01:20 GMT</pubDate>
            <description><![CDATA[<ul>
<li>지도</li>
<li>비지도</li>
</ul>
<p><strong>시각적 탐지 세부 수준</strong></p>
<ul>
<li>이미지 수준: 전체 이미지가 정상인지 비정상인지에 대한 질문에 초점</li>
<li>픽셀 수준: 이미지 내의 비정상적인 영역을 감지하거나 위치를 파악</li>
</ul>
<p><strong>점차 딥 컨볼루션 네트워크의 강력한 표현 능력을 시각적 이상 탐지 문제와 결합하는 문제에 주목하고, 최종적으로 종단 감지 접근 방식을 개발</strong></p>
<h3 id="iii-image-level-visual-anomaly-detection">III. IMAGE-LEVEL VISUAL ANOMALY DETECTION</h3>
<p><strong>비지도 이미지 수준 이상 탐지 방법</strong></p>
<p><strong>A. 밀도 추정</strong></p>
<ul>
<li>먼저 정상 이미지나 특징의 확률 분포 모델을 추정한 후, 새로 관찰된 이미지가 이상인지 정상인지를 확인하고 식별하기 위해 설정된 분포에 대해 테스트</li>
<li>테스트 이미지나 이미지 특징이 정상 이미지 샘플로 추정된 확률 분포 모델과 일치하지 않는 경우, 이를 이상으로 분류</li>
<li>가우시안 모델 및 가우시안 혼합 모델 [10], [11], 최근접 이웃 및 커널 밀도 추정 방법과 같은 비모수 추정 방법 ⇒ 많은 수의 훈련 샘플이 필요</li>
</ul>
<p><strong>C. 이미지 재구성(auto-encoder젤 많이사용)</strong></p>
<ul>
<li><p>재구성 기반 이상 탐지 방법은 정상 이미지의 재구성 오류가 작고 이상 이미지의 재구성 오류가 크다고 가정</p>
</li>
<li><p>중복 압축과 중복 분리</p>
</li>
<li><p>고차원 데이터의 이상 탐지를 위해 딥 오토인코더</p>
</li>
<li><p><strong>성능 향상</strong></p>
<ul>
<li><p>잠재 공간의 분포와 오토인코더의 재구성 오류를 동시에 활용하여 <strong>재구성 기반 모델의 이상 탐지 성능을 더욱 향상</strong></p>
<ul>
<li><p><strong>잠재 공간 분포</strong></p>
<ul>
<li>잠재 공간 분포: 가우시안 혼합 모델</li>
<li>잠재 코드의 확률 분포: 자기 회귀 신경망으로 모델링</li>
<li>잠재 코드에 메모리 유닛을 도입하고, 몇 개의 특징 메모리 유닛을 사용하여 잠재 분포를 표현</li>
</ul>
</li>
<li><p><strong>오토인코더의 재구성 오류 활용</strong></p>
<ul>
<li><p><strong>이미지 재구성의 난이도를 증가</strong></p>
<ul>
<li><p>색상 제거 또는 기하학적 변형 → 변환된 불완전한 입력 이미지를 사용하여 원래의 입력 이미지를 재구성하도록 훈련 (재구성 오류가 보통 큼)</p>
<p>  → 정상 이미지와 이상 이미지 사이의 <strong>차이</strong>를 효과적으로 증가시킬 수 있으며, 이상 탐지의 성능을 향상</p>
</li>
<li><p>ex. <strong>GAN</strong>(생성적 적대 신경망)을 시각적 이상 탐지에 처음 도입했습니다. GAN 모델은 사전에 정상 이미지로 훈련되며, 이후 테스트 이미지와 가장 가까운 정상 이미지 사이의 차이를 계산하여 이상을 감지</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>이미지 재구성과 적대적 훈련을 결합</strong></p>
<ul>
<li>오토인코더와 적대적 훈련을 동시에 사용하여 이미지 이상 탐지에 활용</li>
<li>최적화 기법<ul>
<li>합성곱 오토인코더인 <strong>생성기와 판별자</strong>가 포함됩니다. <strong>평균 제곱 오차 손실</strong>과 <strong>적대적 손실</strong> 두 가지로 모델을 최적화</li>
</ul>
</li>
<li>test단계 탐지 지표<ul>
<li>1) 테스트 단계에서는 <strong>재구성 오류와 판별자의 출력 확률</strong>이 탐지를 위한 지표</li>
<li>2) <strong>재구성된</strong> 이미지의 잠재 코드와 <strong>입력</strong> 이미지의 잠재 코드 간의 <strong>차이</strong>도 이상의 지표</li>
</ul>
</li>
</ul>
</li>
<li><p>오토인코더와 적대적 네트워크의 공동 모델에서 <strong>잠재 코드의 특징 분포를 제약하거나 정규화</strong></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>D. 자기 지도 분류(Self-supervised classification)</strong></p>
<ul>
<li>특정 보조 작업(선행 작업)을 활용하여 대규모 비지도 데이터로부터 사용 가능한 <strong>감독 정보</strong>를 추출</li>
<li><strong>자기 지도된 감독 정보</strong>를 활용하여 주로 딥 컨볼루션 신경망을 통해 시각적 표현을 학습하고, 이러한 표현은 이미지 분류, 객체 탐지 및 이상 탐지와 같은 여러 하위 작업으로 전이</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="iv-pixel-level-visual-anomaly-detection">IV. PIXEL-LEVEL VISUAL ANOMALY DETECTION</h3>
<p><strong>비지도 픽셀 수준의 이상 탐지 접근 방법</strong></p>
<p><strong>A. 이미지 재구성</strong></p>
<p><strong>이미지 공간에서 이상을 탐지</strong></p>
<ul>
<li><p>방법1) <strong>딥 컨볼루션 오토인코더</strong>로 입력 이미지를 압축하고 재구성</p>
<ul>
<li>정상 이미지의 재구성을 학습한 후, 입력 이미지와 재구성된 이미지 사이의 픽셀 차이를 평가하여 잠재적인 이상을 탐지</li>
<li>이상도 측정법) 재구성 전후의 픽셀 간 거리 및 이미지 구조 유사성 측도 (SSIM) [49]을 사용하여 이러한 차이를 측정</li>
</ul>
</li>
<li><p>방법2) <strong>변이형 오토인코더(VAE) + 생성적 적대신경망(GAN)</strong></p>
<ul>
<li>GAN으로 재구성된 이미지의 품질 향상</li>
<li>VAE-GAN의 이상도 측정법) 픽셀수준의 L1거리 사용</li>
</ul>
</li>
<li><p><strong>이상치 탐지법</strong></p>
<ul>
<li><p>재구성 확률, 우도점수 활용 가능</p>
</li>
<li><p>입력 이미지와 가장 가까운 정상 이미지 간의 차이를 계산</p>
<ul>
<li><p><strong>AnoGAN</strong></p>
<ul>
<li><p>GAN모델 훈련 → 테스트 이미지와 가장 가까운 정상 이미지 사이의 차이를 추정하여 이상을 탐지</p>
</li>
<li><p>정상이미지) 반복적인 최적화 과정을 통해 얻음</p>
<p>⇒ 반복적인 탐색과정 수행해야 하기에, 실제론 효율X</p>
</li>
</ul>
</li>
<li><p>탐지 성능 향상: <strong>재구성의 어려움 증가시키기 방법</strong></p>
<ul>
<li>일부 정보 제거 → 완전하지 않거나 손상된 입력이미지로부터 원래의 이미지 재구성하도록 <strong>convolution 오토인코더</strong> 사용</li>
<li>정보의 저하 과정은 비정상 이미지의 재구성 난이도를 효과적으로 증가시킬 수 있으므로 정상 및 비정상 샘플 간의 이상 점수를 크게 키울 수 있으며, 이로써 탐지 성능을 향상</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>B. 특성 모델링</strong></p>
<p><strong>특성 공간에서 이상을 탐지</strong></p>
<ul>
<li><p>수작업으로 설계된 특성 or 신경망에 의해 학습된 특성을 사용하여 → 전체 이미지의 지역 영역의 효과적인 표현을 구축하는 데 전념</p>
</li>
<li><p><strong>정상 이미지의 특성 분포를 모델링</strong></p>
<ul>
<li><p>희소코딩, 가우시안 혼합모델, 클러스터링 (머신러닝 모델)</p>
<p>  : 이상 탐지를 위해 테스트 이미지의 지역 특성이 모델링된 특성 분포와 일치하지 않는 경우 해당 영역은 이상으로 레이블링</p>
</li>
</ul>
</li>
<li><p><strong>성능 향상 방법</strong></p>
<ul>
<li><strong>다중 스케일 모델 앙상블 전략</strong> : 다양한 이미지 영역 크기에서 유도된 여러 단일 모델의 결과를 결합</li>
</ul>
</li>
<li><p><strong>이상 탐지 방법</strong></p>
<ul>
<li>이미지를 많은 작은 이미지 패치로 나눈 다음 이미지 패치 수준에서 이상을 모델링하고 탐지<ul>
<li>훈련 및 테스트 중에 매우 시간이 소요되며, 특히 딥 신경망이 깊은 이미지 특성을 추출해야 할 때는 더 그렇습니다</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>실제 적용 사례</strong></p>
<ul>
<li><p><strong>MVtecAD</strong>로 비지도 이미지 이상탐지 알고리즘 평가</p>
</li>
<li><p><strong>전이된 딥 합성곱 특성을 활용</strong>하고 <strong>특성 회귀</strong>를 통해 이상을 탐지</p>
<ul>
<li>사전에 학습된 <strong>딥 합성곱 특성</strong> (예: ResNet18 [8])을 회귀 목표 또는 선생으로 사용하고, 정상 이미지의 대상 특성을 흉내 내거나 회귀하는 일련의 학생 네트워크를 훈련합니다. 테스트 중에는 학생 네트워크를 사용하여 선생 네트워크의 출력을 예측한 다음 해당 예측 오류와 불확실성 (분산)에 따라 이상 점수를 계산</li>
</ul>
</li>
<li><p><strong>일부 특성 기반 방법</strong>은 <strong>사전에 학습된 깊은 계층적 합성곱 특성</strong>을 활용하여 <strong>다중 공간 컨텍스트 정보</strong>를 코딩하려는 방향으로 진행되고 있으며, 이는 픽셀 수준의 이상 탐지 및 분할에 큰 잠재력을 보여주고 있습니다. Shi 등 [66]은 VGG19 [7]를 비롯한 사전에 학습된 깊은 합성곱 네트워크의 계층적 특성을 최대한 활용하고 이상 탐지를 위한 효과적인 특성 재구성 메커니즘을 개발했습니다.</p>
</li>
<li><p><strong>계층적 합성곱 인코더</strong>를 제안하여 계층적 특성을 추출하고, <strong>자기 지도 학습 전략을 설계</strong>했습니다. 이상 탐지를 위해 특별히 특성 일치 메커니즘을 개발했습니다. 구체적으로, 정상 이미지 패치의 특성을 사전에 추출하고 저장합니다. 그런 다음, 참조 단계에서 테스트 이미지의 특성은 가장 가까운 이웃 검색 방법을 사용하여 이전에 저장된 특성과 일치시킵니다. 마지막으로, 최소 일치 거리를 각 패치의 이상 점수로 취합니다. Cohen 등 [68]은 비슷한 특성 일치 메커니즘을 채택합니다. 그러나 그들은 ResNet18 [8]의 이미지넷 [69]에서 얻은 피라미드 구조의 합성곱 특성을 사용하기를 제안합니다.</p>
</li>
<li><p>또 다른 이미지의 시각적 이상 탐지를 위한 연구 방향으로는 Grad-CAM [70] 및 해석 가능한 심층 생성 모델 [71], [72]과 같은 기울기 기반 주의 메커니즘을 활용하는 것이 있습니다. Venkataramanan 등 [72]은 이상 영역을 찾기 위한 유도된 주의 메커니즘을 개발했습니다. Liu 등 [71]은 정상 데이터로만 훈련된 변분 오토인코더를 사용하여 이미지에서 잠재적인 이상을 추정하기 위한 기울기 기반 시각적 해석 방법을 제안했습니다.</p>
</li>
</ul>
</li>
</ul>
<p><strong>결과적으로, 가장자리 또는 질감 영역에서 자주 큰 재구성 오류가 발생하여 많은 수의 잘못된 이상 경보가 발생할 수 있습니다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Are Transformers Effective for Time Series Forecasting? (AAAI, 2023) (NLinear, DLinear)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Are-Transformers-Effective-for-Time-Series-Forecasting-AAAI-2023-NLinear-DLinear</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Are-Transformers-Effective-for-Time-Series-Forecasting-AAAI-2023-NLinear-DLinear</guid>
            <pubDate>Sat, 12 Aug 2023 05:56:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<h3 id="0-abstract">0. Abstract</h3>
<ul>
<li>LTSF해결위한 Transformer based 해결책의 급증</li>
<li>Transformer는 의미론적인 상관관계를 잘 해결함</li>
<li>순서가 있는 연속적인 point에서 시간적 관계추출해야됨</li>
<li><em>Transformer에서 encoding, token이용하면서 정보를 순서대로 놓아도,</em></li>
<li>self attention매커니즘의 순서가 변하지 않는 것은 일시적 정보손실을 반드시 낳는다*</li>
<li>LTSF-Linear가 기존의 정교한 Transformer-based LTSF 를 넘어서 좋은 성능 보여줌</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="1-introduction">1. Introduction</h3>
<h4 id="시계열">시계열</h4>
<ul>
<li>시계열 문제는 data기반 세계에 만연함</li>
<li>시계열 문제 해결 변천사 : 머신러닝 → 딥러닝</li>
</ul>
<h4 id="transformer">Transformer</h4>
<ul>
<li>Transformer 장점: 순서기반 모델, 병렬적이지 않은 해결, 다양한 적용 분야(NLP, 음성인식, cv</li>
<li>최근 시계열 위한 Transformer기반 해결책 엄청 많이 나옴</li>
<li>흔하지 않은 LTSF 해결위한 transformer모델들</li>
</ul>
<h4 id="transformer-원리">Transformer 원리</h4>
<ul>
<li>Transformer원리: multi-head-self-attention 매커니즘→ self attention이 긴 시계열에서는 잘 작용못함</li>
</ul>
<p>⇒ 요약: 긴 시계열 예측에서 Transformer가 self attention문제로 정보손실 발생할수도있는데, 진짜 효과적인거 맞냐? (목적: 긴 시계열 예측(LTSF))</p>
<h4 id="non-transformer로의-ltsf해결">non-Transformer로의 LTSF해결</h4>
<p>⇒ 요약: 우리는 transformer based말고, non-transformer based인 DMS예측으로 해결하겠다</p>
<h4 id="ltsf-linear-소개">LTSF-Linear 소개</h4>
<ul>
<li>LTSF-Linear 개념: 1layer 선형 모델로 과거 시계열 회귀하여 미래 바로 예측함</li>
<li>LTSF-Linear 적용: 9개의 널리쓰이는 dataset들에 적용해봄</li>
<li>LTSF-Linear 적용결과: 현존하는 복잡한 Transformer보다 20~50% 더 성능 좋음</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="2-preliminaries-tsf-problem-formulation">2. Preliminaries: TSF Problem Formulation</h3>
<p>수식 해석</p>
<blockquote>
<ul>
<li>X: 과거 시계열을 나타내는 변수 </li>
</ul>
</blockquote>
<ul>
<li>C: 여러 시간 단계에서 C 변수의 값</li>
<li>L: 현재 시점에서 모델이 과거 데이터를 얼마나 멀리까지 살펴볼 것인지를 지정하는 값</li>
<li>Xti: time step 
X집합 = t=1부터 L까지의 시간 집합들</li>
</ul>
<blockquote>
<p>T: 미래 time step
측정한 과거시점(L)+1 ~ L+T
= 현재2023년 ~ 2021년(L), T=5이면,
X^은 2022년(L+1) ~ 2026년(L+T)</p>
</blockquote>
<p><strong>⇒ 요약</strong>: <strong>DMS가 긴 시계열에 유리하다.</strong></p>
<p><br/><br/></p>
<hr>
<h3 id="3-transformer-based-ltsf-solutions">3. Transformer-Based LTSF Solutions</h3>
<ul>
<li><p>Transformer-based models로 LTSF에서 많이 발전함</p>
</li>
<li><p>vanilla Transformer model의 문제점과 여러 해결법들</p>
<p><em>(vanilla Transformer model로 LTSF문제 다룰때의 문제점:</em> </p>
<p><em>기존 self attention으로는 2차 시간/기억의 복잡성(앞에껄 기억못함)문제 발생</em> </p>
<p><em>&amp; 자동회귀 decoder로 인해 error누적</em>)
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/345db20c-14a7-4917-be3c-067fabc09131/image.png" alt=""></p>
<blockquote>
<p>(a) preprocessing: 시계열 데이터를 구성 요소로 분해 : 전체적인 추세, 계절성 패턴, 주기적인 변동 및 잔차 오차
→ 분해해서 예측, 이상치 탐지, 시뮬레이션 등에서 활용가능
(b) embedding: 긴 시계열의 의존성 포착 및 시간적 문맥 강화
(c) encoding: 긴 시계열의 의미론적 유지를 위한 2가지 전략
(d) decoding</p>
</blockquote>
</li>
</ul>
<p>*<em>Transformer based LTSF solution들은 self attention의 순서무관적인 성질이 불가피하게 적용되므로, 시간적 정보손실이 불가피하다. *</em></p>
<p><strong>→ 시계열 모델링에서는 연속적인 시간적 관계가 위치관련한 것보다 중요하므로</strong></p>
<p><br/><br/></p>
<hr>
<h3 id="4-an-embarrassingly-simple-baseline-for-ltsf">4. An Embarrassingly Simple Baseline for LTSF</h3>
<ul>
<li><ol>
<li>DMS 사용할 것
<em>(기존 Transformer based LTSF문제들의 해결방안들 : 전부 IMS 사용(오류누적심함)</em></li>
</ol>
</li>
<li><p><em>→ 이 연구에서는 DMS사용할것**</em></p>
</li>
<li><ol start="2">
<li>DMS기반 LTSF-Linear사용할 것</li>
</ol>
</li>
<li><p><em>→ 과거값(L)을 입력으로 사용하고, T시점에서 한 번에 전체 예측을 수행*</em></p>
</li>
<li><p><em>→ 모델이 각 변수의 중요도를 동일하게 고려하고, 변수 간에 공간적인 상관관계를 반영X*</em></p>
</li>
<li><ol start="3">
<li><strong>DLinear와 NLinear 개념</strong></li>
</ol>
</li>
<li><p><em>DLinear: 시계열 데이터의 구성 요소를 분해하고 선형 레이어를 통해 각 구성 요소를 처리하는 방법*</em></p>
</li>
<li><p><em>NLinear: 데이터셋 분포 변화 클때 사용*</em></p>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="5-experiments">5. Experiments</h3>
<h4 id="experimental-settings">Experimental Settings</h4>
<ul>
<li>사전 세팅 : 9개의 현실 데이터셋
특징 → 모두 다변량 시계열
→ MSE, MAE로 비교
→ 4개의 최신 Transformer based methods(FEDformer, Autoformer ,Informer ,Pyraformer ) 포함
→ naive DMS method: Closest Repeat : look-back 윈도우를 통해 이전의 데이터를 살펴보고, 윈도우 내의 마지막 값(가장 최근 값)을 반복하여 예측에 사용합니다. 예를 들어, 10개의 이전 데이터로 구성된 look-back 윈도우가 있다고 가정해봅시다. 해당 윈도우 내의 마지막 값이 50이라면, Repeat 방법은 이후의 예측에 계속해서 50을 사용)</li>
</ul>
<h4 id="comparison-with-transformers">Comparison with Transformers</h4>
<h5 id="quantitative-results">Quantitative results</h5>
<ul>
<li><strong>성능 측면</strong><ul>
<li><strong>다변량</strong> : 변수간 상관관계 없더라도 대부분 transformer적용보다 LTSF-Linear적용한게 예측 성능 좋음<ul>
<li><em>NLinear, DLinear</em> : 분포 이동 및 trend-seasonality특징 처리하는데 좋음</li>
</ul>
</li>
<li><strong>일변량</strong> : transformer적용보다 LTSF-Linear적용한게 예측 성능 좋음</li>
</ul>
</li>
<li><strong>Repeat method</strong><ul>
<li>Exchange-Rate 데이터에서 성능이 젤 좋음 : Transformer based방법들은 일부 잡음에 대해 train data에서 과적합되어 정확도 감소<h5 id="qualitative-results">Qualitative results</h5>
</li>
</ul>
</li>
<li><strong>Transformer의 한계</strong><ul>
<li>Transformer는 비주기적이고, 다른 시간적 패턴을 가진 데이터는 추세 및 결과를 예측 잘 못함</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="6-more-analyses-on-transformer-based-solutions">6. More Analyses on Transformer-Based Solutions</h3>
<p>1) Can existing LTSF-Transformers extract temporal relations well from longer input sequences? </p>
<ul>
<li>일반적으로 시계열 모델에서 <strong>LTSF-Linear 성능은 input look-back window size가 증가함에 따라 성능 향상</strong></li>
<li>Transformer는 <em>look-back window size가 증가함에 따라  성능이 저하 or 안정적일수도</em><ul>
<li>대부분의 Transformer들에는 input=96이 젤 적당함</li>
</ul>
</li>
</ul>
<p>2) What can be learned for long-term forecasting? </p>
<ul>
<li>Transformer는 단기 시계열 예측에만 유용</li>
<li><em>→ look-back window가 작아야 유용함!*</em></li>
<li><strong>단기시계열</strong><ul>
<li>look-back window 영향 큼</li>
</ul>
</li>
<li><strong>장기시계열</strong><ul>
<li>look-back window 영향 작음</li>
</ul>
</li>
</ul>
<p>3) Are the self-attention scheme effective for LTSF? </p>
<ul>
<li><strong>결론</strong><ul>
<li><strong>self-attention같은 복잡한 디자인은 LTSF에 쓸모없다</strong></li>
</ul>
</li>
<li><strong>확인 과정 (ex. Informer)</strong><ul>
<li>기존의 Transformer (예: Informer)에서 이러한 복잡한 디자인이 필수적인지 여부를 확인</li>
<li>Informer를 점진적으로 Linear로 변환<ul>
<li>1) Att.-Linear: 각 self-attention 레이어를 linear 레이어로 대체<ul>
<li>self-attention 레이어는 가중치가 동적으로 변하는 fully-connected 레이어로 간주</li>
</ul>
</li>
<li>2) Embed + Linear: Informer의 다른 보조 디자인 (예: FFN)을 제거하여 임베딩 레이어와 linear 레이어만 남김</li>
<li>3) 모델을 단일 linear 레이어로 단순화</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>4) Can existing LTSF-Transformers preserve temporal order well? </p>
<ul>
<li><strong>결론</strong><ul>
<li>기존 LTSF-Transformer : 시간적 관계 제한적으로 보존,</li>
<li><strong>모든 경우에 대해 LTSF-Linear의 성능 하락폭이 Transformer 기반 방법보다 크며, 이는 기존의 Transformer들이 시간적 순서를 잘 보존하지 못한다</strong></li>
</ul>
</li>
</ul>
<p>5) How effective are different embedding strategies? </p>
<ul>
<li>Transformer들 위치, 시간 임베딩 유무 성능 비교</li>
</ul>
<p>6) Is training data size a limiting factor for existing LTSF Transformers? </p>
<ul>
<li><p><strong>Transformer모델을 시간을 원래꺼와 줄였을때의 성능 비교</strong></p>
<p>  <em>(Traffc 데이터셋에서 실험을 수행하여 전체 데이터셋 (17,544 * 0.7 시간)에서 훈련된 모델(Ori.)과 축소된 데이터셋 (8,760 시간, 즉, 1년)에서 훈련된 모델(Short)의 성능을 비교)</em></p>
<ul>
<li>결과: <strong>축소된 훈련 데이터를 사용한 예측 오차가 보통적으로 더 낮음</strong></li>
<li><strong>더 적은 데이터를 사용해야 한다는 결론을 내릴 수는 없지만, 이는 훈련 데이터의 규모가 제한적인 요인이 아니라는 것을 보여줌</strong></li>
</ul>
</li>
</ul>
<p>7) Is effciency really a top-level priority? </p>
<ul>
<li>DMS 디코더를 사용하는 기본 Transformer와 비교했을 때, 대부분의 Transformer 변형은 실제로는 비슷하거나 더 나쁜 추론 시간과 매개변수를 유발</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="7-conclusion-and-future-work">7. Conclusion and Future Work</h3>
<h4 id="conclusion">Conclusion</h4>
<ul>
<li>장기 시계열 예측 문제에 대한 신흥 Transformer 기반 솔루션의 효과성을 의심합니다.</li>
<li>저희는 DMS 예측 기준선으로서 극히 간단한 선형 모델인 LTSF-Linear을 사용하여 주장을 검증</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="📖-사전-지식-자료">📖 사전 지식 자료</h3>
<h4 id="transformer-1">Transformer</h4>
<h5 id="개념">개념</h5>
<blockquote>
<p>트랜스포머(Transformer)는 2017년에 발표된 딥러닝 모델로, 주로 자연어 처리(Natural Language Processing, NLP) 작업에 사용되는 강력하고 혁신적인 아키텍처입니다. 이 모델은 기존의 순환 신경망(RNN) 기반 모델의 한계를 극복하고, 특히 <strong>긴 시퀀스 데이터</strong>를 처리하는데 뛰어난 성능을 발휘하여 자연어 처리 분야에서 혁신적인 발전을 이끌어냈습니다.
트랜스포머는 &quot;Attention is All You Need&quot;라는 논문에서 처음 소개되었으며, 구글 브레인(TensorFlow) 팀에 의해 개발되었습니다. 이 모델은 인코더와 디코더라는 두 가지 주요 구성 요소로 구성되어 있으며, 각각은 다수의 층으로 구성됩니다. 트랜스포머의 주요 특징은 다음과 같습니다:</p>
</blockquote>
<blockquote>
<ol>
<li><strong>어텐션</strong>(Attention) 메커니즘: 기존의 RNN과 LSTM과 같은 순환 신경망은 시퀀스 데이터를 순차적으로 처리하며 정보를 전달하는 방식이었습니다. 하지만 트랜스포머는 어텐션 메커니즘을 통해 입력 시퀀스의 모든 단어들을 <strong>동시에</strong> 처리하고, 특정 단어가 다른 단어들과 얼마나 연관되어 있는지를 계산합니다. 이를 통해 <strong>시퀀스 간의 관계를 더 잘 이해하고 처리</strong>할 수 있게 되었습니다.</li>
<li><strong>셀프 어텐션(Self-Attention)</strong>: 트랜스포머의 인코더와 디코더 층은 셀프 어텐션 메커니즘을 사용합니다. 이는 입력 시퀀스 내의 각 단어가 서로 어떻게 관련되어 있는지를 계산하여 <strong>가중치를 부여하는 방식</strong>입니다. 이를 통해 모델은 문장 내의 <strong>단어들 사이의 문맥을 파악</strong>하고 중요한 정보를 잘 추출할 수 있습니다.</li>
<li><strong>위치 인코딩(Positional Encoding)</strong>: 트랜스포머는 입력된 단어들의 위치 정보를 학습하는 데에 순서 정보가 없는 멀티헤드 어텐션을 사용합니다. 따라서 위치 정보를 주입하여 각 단어의 상대적인 위치를 모델에게 알려주어야 합니다. 이를 위해 위치 인코딩을 사용하여 <strong>단어의 상대적인 위치 정보를 임베딩에 추가</strong>합니다.</li>
<li><strong>멀티헤드 어텐션(Multi-Head Attention)</strong>: 트랜스포머에서는 어텐션을 여러 개의 헤드로 분할하여 독립적으로 계산하는 멀티헤드 어텐션을 사용합니다. 이를 통해 다양한 관점에서의 어텐션 정보를 학습하고, 모델의 성능을 향상시킵니다.</li>
</ol>
</blockquote>
<blockquote>
<p>트랜스포머는 기존의 NLP 작업들을 획기적으로 개선시키면서, 특히 번역과 같은 시퀀스-투-시퀀스(Seq2Seq) 작업에 매우 성공적으로 적용되었습니다. 이후 많은 변형 모델들이 개발되어 다양한 자연어 처리 작업에 응용되고 있으며, 트랜스포머 아키텍처는 자연어 처리 분야의 핵심 기술로 자리잡고 있습니다.</p>
</blockquote>
<h5 id="transformer에서-self-attention으로-인해-정보손실-어떻게">transformer에서 self-attention으로 인해 정보손실 어떻게?</h5>
<blockquote>
<p>시계열 데이터가 [10, 20, 30, 40]이라고 가정. </p>
</blockquote>
<ul>
<li>Transformer 모델은 이 데이터를 (토큰으로 분할하고 임베딩을 적용)한 뒤 self-attention을 통해 처리.
그러나 self-attention은 순서 정보를 고려하지 않고 각 토큰을 독립적으로 처리하기 때문에,
[10, 20, 30, 40]과 [30, 20, 40, 10]을 동일하게 취급.
이는 일부 상대적인 순서 정보는 보존되지만, 절대적인 시간적인 흐름에 대한 정보는 손실될 수 있다는 의미</li>
</ul>
<h5 id="transformer에서-self-attention의-역할-및-효과">Transformer에서 self-attention의 역할 및 효과?</h5>
<blockquote>
<ul>
<li><strong>Long-range 의존성 학습:</strong> 모든 위치가 다른 위치와 상호작용하기 때문에, 장기적인 의존성을 더 쉽게 학습</li>
</ul>
</blockquote>
<ul>
<li><strong>효율적인 정보 전달:</strong> 입력의 중요한 부분에 집중하여 효율적인 정보 전달</li>
</ul>
<h5 id="희소성-편향-low-rank-property">희소성 편향? low rank property?</h5>
<blockquote>
<ul>
<li><strong>희소성 편향</strong>
  Sparsity bias(희소성 편향)란, 특정 데이터 또는 정보가 다른 데이터에 비해 <strong>상대적으로 희소하게 분포되어 있을 때 발생하는 경향</strong>을 가리키는 용어. .
  이때, 중요한 정보가 희소하게 분포되어 있다면, 모델은 그 <strong>중요한 정보에 더 집중하고 학습</strong>하도록
  <strong>⇒ 입력 시퀀스를 분할해서 데이터를 희소하게 만들어서, 중요 정보에 더 집중하도록</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>low rank property</strong>
  self-attention은 입력 시퀀스의 길이에 따라 큰 행렬 연산을 수행해야 합니다. 이러한 연산은 계산량이 많고 메모리 사용량도 증가시키는 단점이 있습니다. 하지만 일부 행렬은 실제로는 다른 행렬로 근사될 수 있는 경우가 있습니다. 이렇게 근사 가능한 행렬을 저차원의 행렬로 대체하는 것을 저차원 속성
  <strong>⇒ 입력시퀀스의 행렬을 저차원 행렬로 줄여서, 중요 정보에 더 집중하도록</strong><ul>
<li><strong>저차원 근사:</strong> self-attention 레이어에서 사용되는 일부 행렬을 더 낮은 차원의 행렬로 근사</li>
<li><strong>저차원 연산:</strong> self-attention 계산을 수행할 때 행렬 연산을 저차원의 연산으로 대체</li>
</ul>
</li>
</ul>
<h5 id="변형들">변형들</h5>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/d6ea2d69-ecd7-4b04-9bdf-c3f5e6edb809/image.png" alt=""></p>
<ul>
<li><p><strong>LogTrans</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/09c95919-93bc-42f0-92d4-7b0833ac12a0/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - **희소성 편향이 어케 적용?**
        - LogTrans에서는 이러한 계산 복잡도를 줄이기 위해 입력 시퀀스를 **여러 세그먼트로 분할**합니다. 그리고 각 세그먼트에 대해 **self-attention을 적용**할 때, 이전 세그먼트와의 관계를 고려하여 **연결되는 부분만을 선택**합니다. 이렇게 함으로써 특정 세그먼트와 연결된 부분만을 집중적으로 계산하고, 다른 부분은 무시함으로써 계산량을 크게 줄입니다.

            이 과정은 마치 공을 미로 속으로 놓고 특정 규칙에 따라 미로를 통과시키는 것과 비슷합니다. 희소성 편향은 마치 어떤 통로를 통해 통과시킬지를 선택하는 규칙이라고 생각할 수 있습니다. 이렇게 선택된 통로만을 따라 self-attention 연산을 수행하여 계산 비용을 줄이


    - Transformer 모델을 기반으로 한 로그 데이터 분석을 위한 변형 모델
    - 로그 데이터는 주로 시계열 형태로 구성
    - self-attention과 시계열 특성을 고려하여 로그 데이터의 패턴을 학습하고 예측
- **Encoder**
    - LogSparse , convolutional self-attention
- **Decoder**
    - IMS(Iterated Multi-Step)</code></pre><ul>
<li><p><strong>Informer</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/619d4342-ba80-4889-a578-6070efbff9a2/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - 시계열 데이터에 대한 예측을 수행하는 Transformer 기반의 모델
    - 입력 시퀀스의 길이와 패턴을 고려하여 자동으로 가변적인 길이의 시계열 데이터를 처리
- **Encoder**
    - ProbSparse and distiliting self-attention
- **Decoder**
    - DMS(Direct Multi-Step)</code></pre><ul>
<li><p><strong>Autoformer</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/1ca279a9-ae65-4c70-8267-7109cf47c38c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - 자동 기계 학습 모델 구조 탐색(automated model architecture search)을 위한 Transformer 기반의 모델
    - 네트워크 구조, 층 수, 헤드 수, 임베딩 차원 등의 하이퍼파라미터를 자동으로 조정
    - **series auto correlation with decomposition (서로 다른 시간 간격만큼 데이터가 얼마나 상관되어 있는지) :** 자기상관성은 주기성과 추세 등의 패턴을 파악하는 데 도움이 되며, 시계열 데이터의 미래 값을 예측하거나 시계열 모델을 구축하는 데 중요한 정보를 제공
- **Encoder**
    - Series auto-correlation with decomposition
- **Decoder**
    - DMS with auto-correlation and decomposition</code></pre><ul>
<li><p><strong>Pyraformer</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/cd26001f-a4a6-4a09-ac64-bbfcaf88ad03/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - **희소성 편향이 어케 적용?**
        - 입력 시퀀스를 **여러 레벨의 피라미드 구조로 분할**하고, 각 레벨에서 self-attention을 수행하는 방식

    - 피라미드 구조(pyramid structure)를 활용하여 입력 시퀀스의 길이에 따라 유연하게 처리할 수 있는 Transformer 기반의 모델
    - 입력 시퀀스를 여러 다양한 해상도로 다운샘플링하고, 각 해상도에서의 정보를 합성하여 전체 시퀀스에 대한 표현을 생성
- **Encoder**
    - Multi-resolution pyramid attention
- **Decoder**
    - DMS along spatio-temporal dimension</code></pre><ul>
<li><p><strong>FEDformer</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/0c6d78d3-9349-48f8-afcb-6d6c78eaac93/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - 데이터 분산 학습을 위한 효율적인 Transformer 기반 모델
    - Federated Learning + Transformer
    - 여러 개의 클라이언트에서 분산된 데이터를 학습하고 전역 모델을 업데이트
    - 중앙 집중화된 데이터를 전송하지 않고, 로컬 데이터에서 그래디언트를 계산하여 개인 정보 보호와 데이터 보안을 강화
- **Encoder**
    - Frequency enhanced block with decomposition
- **Decoder**
    - **DMS** with frequency attention and decomposition</code></pre><ul>
<li><p><strong>Repeat</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/5b214dca-2e9a-4488-8501-929859044f70/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h4 id="seasonal-trend-decomposition">Seasonal-Trend Decomposition</h4>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/35337be7-4f9f-4038-9e23-c31d10992b64/image.png" alt=""></p>
<p>연간 매출 데이터를 가정해보면, 계절적 패턴(예: 연말에 매출이 증가하는 경향)과 전반적인 추세(예: 연간 매출이 점차 상승하는 경향)</p>
<ul>
<li><p><strong>장점</strong></p>
<p>  시계열 데이터는 시간에 따라 변화하는 데이터이기 때문에, 계절성과 추세를 분해하여 개별 구성 요소를 분석함으로써 데이터의 특성을 파악할 수 있습니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다: </p>
<ol>
<li><strong>계절성 추정:</strong> 계절성-추세 분해를 통해 <strong>계절성 구성 요소</strong>를 추정할 수 있습니다. 이를 통해 데이터의 주기적인 변동성을 확인하고, 계절성 패턴을 파악할 수 있습니다. <strong>예를 들어, 매월 판매량 데이터에서 계절성 구성 요소를 추정하여 매년 같은 시기에 어떤 제품이 가장 많이 팔리는지를 확인</strong>할 수 있습니다.</li>
<li><strong>추세 파악:</strong> 추세 구성 요소를 추정함으로써 데이터의 <strong>장기적인 변동성</strong>을 파악할 수 있습니다. 추세는 데이터가 장기적으로 증가하거나 감소하는 경향을 보여줍니다. 이를 통해 <strong>시장 동향을 예측하거나 장기적인 패턴을 파악</strong>할 수 있습니다.</li>
<li><strong>잔차 분석:</strong> 잔차는 계절성과 추세를 제외한 <strong>나머지 변동성</strong>을 나타냅니다. 잔차를 분석함으로써 계절성과 추세로 설명되지 않는 불규칙한 요소들을 파악할 수 있습니다. <strong>이를 통해 예측 모델의 정확도를 높이거나, 데이터의 이상치를 감지</strong>할 수 있습니다.</li>
</ol>
</li>
</ul>
<h4 id="etc">Etc</h4>
<h5 id="naive-dms-dms-ims">Naive DMS, DMS, IMS</h5>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><strong>Naive DMS</strong><ul>
<li>다음 시간 단계의 값을 예측하기 위해 이전 시간 단계의 값을 사용</li>
</ul>
</li>
<li><strong>DMS</strong><ul>
<li>여러 시간 단계를 한 번에 예측하는 방법</li>
<li>이전 시간 단계의 값을 사용하여 한 번에 다음 여러 시간 단계를 예측</li>
</ul>
</li>
<li><strong>IMS</strong><ul>
<li>예측된 값을 다시 입력으로 사용하여 반복적으로 예측하는 방법</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>예시</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/9146ebca-eaa9-43f7-ad89-ccc24fe0a186/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **Naive DMS**
    - t=6의 값을 예측하려면, t=5의 값을 그대로 사용.

        예측: t=6, y=30

- **DMS**
    - t=6, t=7, t=8의 값을 예측하려면, 이전 시간 단계의 값을 사용하여 한 번에 세 가지 값을 예측

        예측: t=6, y=35
        t=7, y=40
        t=8, y=45

- **IMS**
    - t=6, t=7, t=8의 값을 예측하려면, 이전 시간 단계의 값을 사용하여 첫 번째 예측을 수행하고, 이 예측값을 다시 입력으로 사용하여 두 번째 예측을 수행. 이러한 과정을 반복하여 여러 시간 단계를 예측

        예측: t=6, y=35 (t=5의 값 사용)
        t=7, y=40 (t=6의 예측값 사용)
        t=8, y=45 (t=7의 예측값 사용)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Forecasting with Sparse but Informative Variables:
A Case Study in Predicting Blood Glucose (AAAI, 2023)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Forecasting-with-Sparse-but-Informative-VariablesA-Case-Study-in-Predicting-Blood-Glucose-AAAI-2023</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Forecasting-with-Sparse-but-Informative-VariablesA-Case-Study-in-Predicting-Blood-Glucose-AAAI-2023</guid>
            <pubDate>Sat, 12 Aug 2023 05:23:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<h3 id="1-introduction">1. Introduction</h3>
<blockquote>
<ul>
<li>SIV(희소하지만 정보를 제공)의 효과적 활용 위해, 이 논문의 독자적인 접근방식이 rMSE면에서 기준선 접근방식보다 뛰어남</li>
</ul>
</blockquote>
<ul>
<li>SIV가 손상되면 논문의 독자적 접근방식도 성능 낮아질것</li>
<li>결론*) 논문의 접근방식은 예측에서 SIV를 더 효과적 사용가능</li>
</ul>
<blockquote>
<p>내재+외재 = 예측정확도 향상</p>
</blockquote>
<blockquote>
<p>But 혈당과 같은 생리학적 변수의 예측에서는 내재+외재에서 예측 정확도가 향상되는 경우 없을수있음</p>
</blockquote>
<blockquote>
<ul>
<li>보조신호와 대상 신호간의 비제로값이 상대적 불일치 때문</li>
</ul>
</blockquote>
<ul>
<li>보조신호(외재)가 대상 신호(내재)에 영향 미치는데 매우 희소( 희소하지만 정보를 제공하는 변수(SIV)
=⇒ 희소성에도 불구하고 SIV를 활용하여 전반적인 예측 개선</li>
</ul>
<blockquote>
<p>SIV문제</p>
</blockquote>
<ul>
<li>언제 발생) 부가변수가 시간에 따라 대상 변수의 크기를 증가시키거나 감소시킨다는 것을 알고는 있지만 정확한 효과가 알려지지 않을 때 발생</li>
<li>왜 문제점인가) 일반적인 다중 입력 예측 접근방식이 부가변수 활용 못하도록함.(=단일 입력만 처리 가능)</li>
</ul>
<blockquote>
<p>SIV문제 극복 모델</p>
</blockquote>
<ul>
<li>예측정확도 향상되는 방향으로 활용</li>
<li>중요한 변수가 대부분의 시간에서 0값을 가질때 발생하지 않도록</li>
</ul>
<blockquote>
<p>The Linked Encoder/Decoder</p>
</blockquote>
<ul>
<li>내재적 효과와 외재적 효과의 분리(연결된 2개의 디코더 네트워크통해 구현) + 도메인 지식의 통합(SIV네트워크의 출력 제한)</li>
</ul>
<p>Contribution</p>
<ul>
<li><strong>희소하지만 정보를 제공하는 변수(SIV) 문제를 제시합니다.</strong></li>
<li><strong>SIV의 효과를 분리하고 도메인 지식을 통합함으로써 SIV를 활용하는 혁신적인 예측 접근 방식을 제안합니다.</strong></li>
<li><strong>혈당 측정을 예측하는 문맥에서 모델을 평가하고, noise가 적은 경우에도 SIV를 효과적으로 활용함을 보여줍니다.</strong></li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="2-problem-setup">2. Problem Setup</h3>
<blockquote>
<p>다중 입력 단일 출력 시계열 예측작업</p>
</blockquote>
<ul>
<li>기존엔 단일 대상변수의 미래값 예측</li>
<li>but 추가 보조변수(x’)의 미래값 예측 하도록</li>
</ul>
<blockquote>
<p>하려는 것</p>
</blockquote>
<ul>
<li>대상신호의 다음 h개의 시간점 예측</li>
</ul>
<blockquote>
<p>걍 SIV문제를 혈당예측(BG농도 추정)에 활용하겠다.</p>
</blockquote>
<ul>
<li>인슐린, 탄수화물 측정 이후 정확한 예측 중요해서, 그 시간동안 가장 혈당 변동성이 크고 개인에게 위험 제공해서</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="3-methods">3. Methods</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/dc140028-c1ab-4d56-8ed4-c233220f95b8/image.png" alt=""></p>
<blockquote>
<ul>
<li>인코더 1개 , 디코더 2개(SIV동태, 내재적 동태)로 구성
특징</li>
</ul>
</blockquote>
<ul>
<li>디코더 공통: hidden state공유하며 병렬처리</li>
<li>SIV 디코더: SIV신호를 입력받음</li>
</ul>
<blockquote>
<p>$h_0θt$는 두개의 디코더의 합</p>
</blockquote>
<ul>
<li>내재, 외재적 효과 모두 포착</li>
<li>즉, yˆt = FC($h_0θt$)</li>
</ul>
<blockquote>
<p>주의점</p>
</blockquote>
<ul>
<li>x0=0일때는  φ가 활성화되지 않으며, h0θt = hθt가 됨</li>
<li>SIV신호: 시간별로 이동되어, 인코더의 상대적 위치를 암묵적 표현 </li>
</ul>
<blockquote>
<ul>
<li>하나의 SIV를 가진 설정에 대한 제안된 아키텍처 개요 제시</li>
</ul>
</blockquote>
<ul>
<li>여러 SIV가 있는 경우, 보조 디코더 수 늘리고, 각 SIV의 알려진 효과에 따라 제한 적용</li>
</ul>
<blockquote>
<p>φ</p>
</blockquote>
<ul>
<li>관련된 SIV신호와  $h_0θt$만 입력받음
$h_0θt$</li>
<li>모든 SIV디코더 시스템에의해 수정됨</li>
</ul>
<blockquote>
<p>FC 이후의 디코더 단계에 전달되는 hidden state</p>
</blockquote>
<ul>
<li>SIV 개수 +1개</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/021dea52-0375-4847-ad4d-d60391c2d58c/image.png" alt=""></p>
<blockquote>
<p>SIV 활용이 어려운 이유</p>
</blockquote>
<ul>
<li>SIV가 입력 창의 단 하나의 시간점에서만 발생</li>
<li>훈련 중 gradient에 거의 영향X</li>
</ul>
<blockquote>
<p>Figure3</p>
</blockquote>
<ul>
<li>기준선, 제거 실험에 대해 성능 향상</li>
<li>입력시계열의 첫번째 0이 아닌 SIV값 이전까지의 값=0</li>
<li>계속 누적되어 구성됨</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="4-experimental-setup">4. Experimental Setup</h3>
<blockquote>
<p>&lt;예측&gt;</p>
</blockquote>
<ul>
<li>BG: 혈당</li>
<li>목표: 2가지 SIV (탄수화물, 인슐린 볼러스)기반하여 미래 30분 후의 BG(h=6)예측</li>
<li>h=6: 일반적인 BG 예측 벤치마크</li>
<li>대상, 보조변수: 0~1사이 스케일링 , 최대 예상값에 선형스케일링 적용</li>
<li>각 개인 훈련, 검증, test data: 겹치는 길이 T + h (모델 입력과 레이블로 사용)</li>
</ul>
<blockquote>
<p>&lt;평가&gt;</p>
</blockquote>
<ul>
<li>SIV가 제거될때, 모델이 학습할 수 있는 대상변수로부터 최대 정보량 학습할 수 있도록</li>
<li>SIV가 없는 데이터에서 훈련 및 테스트</li>
<li>기준 인코더/디코더 오차와 SIV사용의 개인별 개선도 비교<ul>
<li>이 방법이 기준에 비해 개인별로 얼마나 큰 개선 제공하는지 확인</li>
<li>기준에서 SIV 잘 모델링X → 개인에 대해 기준오차 높음</li>
<li>SIV 사용 낮으면 → 우리 접근방식이 기준에 비해 더 큰 개선 제공</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="5-conclusion">5. Conclusion</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a220b414-0418-464d-8455-f4a256edfaac/image.png" alt=""></p>
<blockquote>
<ul>
<li>SIV(Silent Information Versioning) 문제는 RNN을 사용한 다중 입력 예측에서 발생하는 일반화 성능 저하 문제입니다.</li>
</ul>
</blockquote>
<ul>
<li>이 문제는 희소하게 샘플링된 변수(SSV) 문제와는 별개로, 결측치와 노이즈를 처리하는 기존의 보간 접근 방식으로는 해결할 수 없습니다.</li>
<li>SIV 문제는 아직 해결되지 않았지만, 변수 간 상호 관계를 학습하기 위해 어텐션 메커니즘과 같은 여러 기법이 제안되었습니다.</li>
<li>그러나 이러한 기법들은 희소성 문제를 고려하지 않거나 도메인 지식을 충분히 활용하지 않는 경우가 많습니다.</li>
<li>SIV 문제를 해결하기 위해 변수 간 관계를 명시적으로 모델링하는 다양한 접근 방식이 제안되었지만, 희소성 문제를 다루지 않거나 도메인 지식을 충분히 활용하지 못한 경우가 있습니다.</li>
<li>우리의 연구는 SIV 문제를 해결하기 위해 은닉 상태의 부호를 제한함으로써 더 유연한 접근 방식을 제안하고 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Outlier Impact Characterization for Time Series Data (AAAI,2021)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Outlier-Impact-Characterization-for-Time-Series-Data-AAAI2021</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Outlier-Impact-Characterization-for-Time-Series-Data-AAAI2021</guid>
            <pubDate>Sat, 12 Aug 2023 05:11:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😅 이번 리뷰는 손필기로 대체합니다
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/dce89628-49ab-4b57-9eb9-eb255c1f9e05/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/b3cf2738-365f-4636-9b7b-76723048183d/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/6fd0ed44-f539-438d-a4df-62307ef33f35/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/79785002-0fb5-4f56-8d9b-090a1253bed1/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/86aeae38-bea7-42bf-bd2f-7c38cf214628/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/a344a319-07f4-4088-9f58-9270bede2db1/image.png" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/c91614fc-baaf-4286-83e0-5e0730a963b5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Greykite: Deploying Flexible Forecasting at Scale at LinkedIn (KDD,2022)]]></title>
            <link>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Greykite-Deploying-Flexible-Forecasting-at-Scale-at-LinkedIn-KDD2022</link>
            <guid>https://velog.io/@ha_yoonji99/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Greykite-Deploying-Flexible-Forecasting-at-Scale-at-LinkedIn-KDD2022</guid>
            <pubDate>Sat, 12 Aug 2023 05:07:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 논문 입문자가 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.📌
😅 이번 리뷰는 손필기로 대체합니다
😊 개인 기록용 포스트입니다</p>
</blockquote>
<hr>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/406ec8fe-491c-48ba-8a36-c0288517a16d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/388890c0-a924-49aa-b152-7d03c39756c5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/768b63f5-eb2a-44af-85fe-fb414dea5cdb/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/e76b1e50-3b9f-4513-b19a-7c8d23d6021b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/24049a4d-b644-4ea7-805c-2cb03d265449/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/d8038a05-0d7d-4036-ab5d-d4966f82fe52/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/1bbd71a3-320e-462c-b54b-8eb0998f3109/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/b1b612a0-51c0-4090-a598-3371f99d31dc/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/ce64b4e2-5040-4fec-a954-b9d14115b13a/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/23e44d8e-7c14-4981-9037-7e1b9f40b730/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/6efd5727-90ad-4f18-a979-770edbd7377f/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Deep Learning] Loss Function 총 정리 (MAE, MSE, RMSE, Cross Entropy)]]></title>
            <link>https://velog.io/@ha_yoonji99/Deep-Learning-Loss-Function-%EC%B4%9D-%EC%A0%95%EB%A6%AC-MAE-MSE-Cross-Entropy</link>
            <guid>https://velog.io/@ha_yoonji99/Deep-Learning-Loss-Function-%EC%B4%9D-%EC%A0%95%EB%A6%AC-MAE-MSE-Cross-Entropy</guid>
            <pubDate>Sat, 12 Aug 2023 04:58:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 개인적으로 정리한 Loss function의 전반적인 흐름과 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다. 📌</p>
</blockquote>
<hr>
<h3 id="0-목차">0. 목차</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/25391ff0-dc05-4623-961c-cd124c2e24be/image.jpg" alt=""></p>
<hr>
<h3 id="1-loss-function-개념">1. Loss function 개념</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/996e087a-92e4-41ef-a7b4-ad80890006b8/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/fd9e9776-06ca-409b-ab14-67bf50149037/image.jpg" alt=""></p>
<hr>
<h3 id="2-데이터-형식에-따른-손실-함수">2. 데이터 형식에 따른 손실 함수</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/9741b416-0b6a-435a-8a10-e770d5201f81/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6b5f2c43-c033-4fb1-ace6-455e3494b788/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/dd32c4f9-d4be-4cd1-8763-1d5f41eb2c13/image.jpg" alt=""></p>
<hr>
<h3 id="3-데이터-형식에-따른-손실-함수---회귀">3. 데이터 형식에 따른 손실 함수 - 회귀</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/77f3ec32-b12e-4ee3-ac0a-59d4b4d9b372/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/e582fec7-6f07-4819-83ba-bd6458c84f32/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/b79f800b-a013-443b-bc2f-9d63574de677/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/4b1c24c4-1c13-4e61-ab8d-35766decc30c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/24dc0062-ef05-4d2c-9abb-115b47490142/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/5ac251e2-6e49-4ffb-b88d-6d67da445046/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/399f012a-1c51-4ac6-be09-13a0aa38856f/image.jpg" alt=""></p>
<hr>
<h3 id="4-데이터-형식에-따른-손실-함수---entropy-cross-entropy">4. 데이터 형식에 따른 손실 함수 - Entropy, Cross Entropy</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/37015e7c-aca7-4966-a02a-2cf93649523d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/97e6f343-018c-4076-b904-97ee49cf5d4c/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/f9619022-45f3-4d1f-b572-5b0fca401aee/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/4d2dde9f-eb25-4b64-9f87-f5fead3ddf06/image.jpg" alt=""></p>
<hr>
<h3 id="5-데이터-형식에-따른-손실-함수---binary-categorical-cross-entropy">5. 데이터 형식에 따른 손실 함수 - Binary, Categorical Cross Entropy</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ebf04bdc-8d32-48ed-b5eb-57a5e2cb913f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/9230ae2d-ac71-4dee-ad82-c57a2ce5fec0/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/37fa10fa-d558-419f-9ede-3cabfc80ea36/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/fafd4487-8fb8-4e90-bae8-2c9f9aac7482/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/c701ec15-0d05-41be-a8e7-d01390137ec5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/ecdb0f8b-ccd4-4c3e-bcbf-93e8e559e2ba/image.jpg" alt=""></p>
<hr>
<h3 id="6-index">6. Index</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/923f1fd3-96b2-4c84-8076-f60e0d36e589/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/a593d18a-fb6a-47ab-aa08-043ecb7c3f8b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/2d171abf-2159-4209-933a-fc8373f798ba/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/6a9504c0-c3d6-418b-9988-0cf12ee36752/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/d347b9d8-df5e-4f27-9c7d-2e951a9a1460/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/c7bed0fa-6b0d-4827-8bd2-ea15fd95529c/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 13강: Attention]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-13%EA%B0%95-Attention</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-13%EA%B0%95-Attention</guid>
            <pubDate>Sat, 12 Aug 2023 04:41:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌
😅 이번 강은 손필기로 대체합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/d1e7a344-8a36-412e-9d5e-17fd1e453684/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/fd792893-72c6-4c9b-929d-eddbf559ce18/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/0aceae84-fe46-42f5-a9cc-0d7bd257106b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/b36336a8-5f6e-41b1-8f8e-d7d89b5ca782/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 12강: Recurrent Neural Networks]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-12%EA%B0%95-Recurrent-Neural-Networks</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-12%EA%B0%95-Recurrent-Neural-Networks</guid>
            <pubDate>Sat, 12 Aug 2023 04:39:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌
😅 이번 강은 손필기로 대체합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6389dcb2-2fd0-407e-9910-fb8ff65aaa17/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/e9e90393-3b61-43d5-9b61-5410ab4ec2a5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/9d4c0352-4750-4866-87a3-a0bb36c0011f/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/00aa0ed4-6891-4805-91ae-253ab643e054/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/c7665408-48cc-4d6b-bc27-6212d118501a/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 11강: Training Neural Networks (Part2)]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-11%EA%B0%95-Training-Neural-Networks-Part2</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-11%EA%B0%95-Training-Neural-Networks-Part2</guid>
            <pubDate>Sat, 12 Aug 2023 04:16:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌</p>
</blockquote>
<hr>
<h3 id="1-learning-rate-schedules">1. Learning Rate Schedules</h3>
<p><strong>1) 비교</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/08d46cf3-adba-4a16-9d3b-096a4524be58/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><strong>very high LR:</strong> loss가 급증함</li>
<li><strong>low LR</strong>: 매우 천천히 학습 진행</li>
<li><strong>high LR</strong>: 매우 빨리 수렴하지만, loss가 덜 낮아짐</li>
<li><strong>good LR</strong>: 적당</li>
</ul>
</li>
<li><p><strong>질문</strong></p>
<ul>
<li><p><strong>Q. 어떤 LR이 가장 사용하기 적절한가?</strong></p>
</li>
<li><p>A. 다 ㄱㅊ음! high LR부터 시작해서 줄여가보자.</p>
<p>  = <strong>LR Schedule</strong> 이라고 함</p>
</li>
</ul>
</li>
</ul>
<p><strong>2) LR Decay</strong></p>
<p><strong>a. Step Schedule</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6eadf92c-7e8b-491e-8fa8-e0d75b7cfa93/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>고정된 point들에 LR을 감소해줌</li>
<li>ex. ResNet → 0.1부터 시작해서 30 epoch마다 0.1<em>0.1, 0.1</em>0.1*0.1 이런식으로 줄임</li>
</ul>
</li>
<li><strong>문제점</strong><ul>
<li><strong>trial &amp; error가 너무 많음</strong>
  = train model 에 너무 많은 새로운 hyper parameter넣음
  = 너무 많은 경우의 수를 생각해서 tuning 해야됨
  = LR을 decay할 특정 지점 선택해야됨
  <strong>⇒ 몇번 반복시마다 LR줄일건지 &amp; 어떤 LR로 줄여나갈건지 결정해줘야 됨</strong></li>
</ul>
</li>
</ul>
<p><strong>b. Cosine Schedule</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/8f18a3d8-f03c-40dc-bd94-a16b5c7928b9/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>LR을 decay할 특정 지점 설정하는 대신, <strong>초기 LR만 설정</strong><ul>
<li>기존보다 매우 적은 hyperparameter로 train하기 더 쉬움</li>
<li><strong>train longer ↑ → 성능 ↑</strong></li>
</ul>
</li>
</ul>
</li>
<li><p><strong>해석</strong></p>
<ul>
<li>절반쯤에 LR이 떨어짐
  = 첨에 LR 높게 시작하고, train 끝쯤에 LR이 0에 가까워짐</li>
</ul>
</li>
<li><p><strong>문제점</strong></p>
<ul>
<li>계산 복잡도 올라감</li>
</ul>
</li>
</ul>
<p><strong>c. Linear Schedule</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/2fcd2aed-d5b0-4393-826a-c1055ce12cee/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>기존보다 simple함</li>
</ul>
</li>
<li><strong>cf) cos과 linear중에 뭐가 더 나은지는 연구가 적어서 말하기 애매함.</strong><ul>
<li>domain별로 선호하는 LR schedule 존재<ul>
<li>cv : cos schedule 선호</li>
<li>NLP: linear 선호</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>d. Inverse Sqrt Schedule</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6104c499-bfea-495a-9542-fc21a8814963/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>square root 사용</li>
</ul>
</li>
<li><strong>문제점</strong><ul>
<li>초기 high LR에서 갑자기 확 줄어듦</li>
</ul>
</li>
</ul>
<p><strong>e. Constant</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/31472cf1-c210-4e3e-af6e-9d9004c219e2/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>젤 흔함</li>
<li>생각보다 잘 적용됨 (걍 이거 사용해도 ㄱㅊ음)</li>
<li>더 복잡한 schedule로 갈수록, 몇% 더 좋은 성능</li>
</ul>
</li>
<li><strong>기존 Schedule과의 차이</strong><ul>
<li>모델 work/not work에서 차이X</li>
<li>constant → 더 복잡한 schedule로 갈수록, 몇% 더 좋은 성능</li>
<li>걍 모델이 work만 되게 하면 되면, constant가 괜찮은 선택</li>
</ul>
</li>
<li>cf) SGD+Momentum → LR decay schedule 선택 중요
  RMSProp or Adam → 걍 constant 써도 ㄱㅊ</li>
</ul>
<ul>
<li><p><strong>관련 질문</strong></p>
<p>  <strong>Q. Loss가 높아졌다 낮아졌다 다시 높아지는 경우가 있나요?</strong>
  A. 있음. zero-grad가 되는 경우를 고려하지 않을때, task의 type에 따라 bad dynamic을 볼 수도 있다. data corruption이 explode를 유발 가능하다
  (일반적인 답은 아님, 사바사)</p>
</li>
</ul>
<p><strong>3) Early Stopping</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/0d70917f-6a54-415e-87ac-69fe69b24617/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>val의 accuracy가 감소하려할때 (overfitting 전) 반복 중지시켜야됨<ul>
<li>매 iteration마다의 model snapshot저장후, val set에서 가장 잘 work시의 weight가져옴</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="2-gpu多-choosing-hyperparameters">2. (GPU多) Choosing Hyperparameters</h3>
<p>📍 Grid, Random Search
<strong>1) 방법</strong></p>
<p><strong>a. Grid Search</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6080d604-c039-4187-b7e9-729c1d94dae9/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>미리 정해진 숫자들</li>
</ul>
</li>
</ul>
<p>b. <strong>Random Search</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/465b8ab7-8b15-49a1-a5b2-9357c1c3e8e0/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>범위 내의 랜덤한 숫자들</li>
</ul>
</li>
</ul>
<p><strong>2) 비교</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a7e05f71-b2a5-46df-9c64-48fef5305036/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li>Grid Search: 중요 파라미터들을 <strong>덜 잡아냄</strong></li>
<li>Random Search: 중요 파라미터들을 <strong>더 많이 잡아냄</strong></li>
</ul>
</li>
</ul>
<p><strong>3) Random Search Weight decay</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/dd0461cd-d891-414c-ad03-82cdd5d2c232/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="3-gpu-無-choosing-hyperparameters">3. (GPU 無) Choosing Hyperparameters</h3>
<p>📍 총 7step 과정</p>
<p><strong>1) 과정</strong></p>
<p><strong>a. 초기 loss 측정</strong></p>
<ul>
<li><strong>weight decay 설정 안한 상태에서, 맨 처음 loss 확인</strong>
  ex. softmax → 맨 처음 loss값이 logC가 아니면, 네트워크 오류있음</li>
</ul>
<p><strong>b. 작은 sample을 overfit해보기</strong></p>
<ul>
<li><strong>작은 training set (5~10 미니배치)에서 100% accuracy가 나오는지 확인</strong><ul>
<li>loss가 잘 안떨어지면, LR, weight initialization 고려</li>
</ul>
</li>
</ul>
<p><strong>c. loss가 줄어드는 LR찾기</strong></p>
<ul>
<li><strong>Step2의 architecture 고정 후, 모든 train data 활용하여 100 iteration동안의 LR시도</strong>
  → loss가 줄어드는 LR 찾기</li>
</ul>
<p><strong>d. epoch 1~5번 돌려보며, weight decay 조정</strong></p>
<ul>
<li>여기서 엄청 낮은 성능을 얻을리X</li>
</ul>
<p><strong>e. Refine grid, train longer</strong></p>
<ul>
<li>Step4에서 고른 모델 epoch 늘려서 train시킴
  → 엄청 오래걸릴수도</li>
</ul>
<p><strong>f. Learning curve 확인하기</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/075087f3-fe25-4d26-96e6-cbb180cf85cd/image.png" alt=""></p>
<ul>
<li><p>train loss → 움직이는 손실평균</p>
</li>
<li><p><strong>train loss</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/59a4237c-eaa8-48ac-a52e-841958faf09b/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **해석**
    - **loss가 처음에 평평하다가 갑자기 감소**
        = **weight 초기화**가 좋지 않음 (train 초기에 진전이 없어서)


    ![](https://velog.velcdn.com/images/ha_yoonji99/post/149a1864-5e3e-487b-a139-6bc72798b7e3/image.png)


- **해석**
    - **loss가 감소하다가 더 떨어질 가능성 있지만 안떨어짐**
        = **LR 설정** 좋지 않음 (LR이 너무 높았을것)


![](https://velog.velcdn.com/images/ha_yoonji99/post/dc557201-6215-4113-b628-4879dbe433fd/image.png)


- **해석**
    - **너무 빨리 LR을 줄인 경우**
        = loss가 **flat해지는 지점까지 기다렸다가 decay**하기</code></pre><ul>
<li><p><strong>train, val accuracy</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/5decfcc2-e15a-452c-b742-ed8ccd67059f/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **해석**
    - **train과 val의 accuracy가 같이 증가 &amp; 적당한 차이 유지**
        →  **해결) train 더 시키면 됨**


    ![](https://velog.velcdn.com/images/ha_yoonji99/post/bb7a1684-31a3-4065-9ddc-50ac0e1f25c4/image.png)


- **해석**
    - **train과 val gap이 갈수록 커짐 = 오버피팅**
        → **해결) regularization ↑***(=L2 규제에서 $\lambda$를 더 크게 지정 or data augmentation)***, data 더 모으기**


![](https://velog.velcdn.com/images/ha_yoonji99/post/4f829e97-873a-4c48-94dc-d60ec7f87dc1/image.png)


- **해석**
    - **gap이 거의 없음 = 언더피팅**
        **→ 해결) train longer, 더 큰 모델 사용** </code></pre><p><strong>g. GOTO step5</strong></p>
<ul>
<li>하이퍼파라미터 조정 반복</li>
<li>LR, LR decay schedule, update type</li>
<li>regularization(L2, Dropout strength)</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="4-after-training-model-ensemble-tiptrick-lr-schedule-polyak-averaging">4. After Training: Model Ensemble (Tip&amp;trick: LR schedule, polyak averaging)</h3>
<p>📍 앙상블, transfer learning, large-batch training</p>
<p><strong>1) Model Ensembles</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/b271702e-01c3-4350-9572-4331d13e0cfe/image.png" alt=""></p>
</li>
</ul>
<pre><code>- multiple 서로 다른 모델들 학습
- 학습 결과를 test time에 평균내기
- 앙상블 하면 **2%정도** 성능 올라감</code></pre><ul>
<li><p><strong>Tips &amp; Tricks (하나의 모델로 앙상블 효과 내기)</strong></p>
<ul>
<li><p><strong>방법</strong></p>
<ul>
<li><p><strong>LR schedule 활용하기</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/017eaa9a-54c3-43c8-a4cc-fb68636bc391/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>        : LR decay 주고, 특정 시점마다 다시 LR 높게 주면서 구간별 모델의 snapshot을 저장하여 모델이 낸 결과를 평균내어 앙상블 구현


    - **Polyak averaging**

        ![](https://velog.velcdn.com/images/ha_yoonji99/post/397b97e5-17bd-4405-87b6-730cac3d9178/image.png)


        : train 후의 파라미터가 아닌, **train 시의 파라미터** moving average(x)를 test에 활용</code></pre><p><br/><br/></p>
<hr>
<h3 id="5-after-training-transfer-learning">5. After Training: Transfer Learning</h3>
<p>📍 feature extract, fine tuning</p>
<p><strong>1) 발생 배경</strong></p>
<ul>
<li>CNN에서 많은 데이터가 필요하다는 문제에 해결책 제시</li>
</ul>
<p><strong>2) CNN에서 적용해보기</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a626a724-e98d-4e0e-9ca6-54621b5afce6/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>dataset이 작다면 매우 효과적</li>
<li><strong>CNN을 feature 추출기로 만들고 → 그 위에 linear 분류</strong></li>
</ul>
</li>
<li><p><strong>사용 예시</strong></p>
<ul>
<li>feature를 우리가 신경쓰는 <strong>어떤 작은 data set에 적용</strong> (=이미지넷의 1000개 카테고리 분류대신, 10개의 종류 분류정도만 하고 싶은 것)
  → 행렬 임의로 재초기화 (ex. imageNet: 4096<em>1000, 새로운 class: 4096</em>c<em>10)
  → *</em>(Freeze these)** 모든 이전 계층의 가중치 고정
  → 선형 분류기 훈련
  → 마지막 계층 파라미터들만 훈련
  → 데이터에 수렴</li>
</ul>
</li>
<li><p><strong>성능 비교 예시</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/9f182b0a-c3f7-42dc-8163-5916d1460aca/image.png" alt=""></p>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/ha_yoonji99/post/6587057d-6334-464e-b0b8-783955797df5/image.png)


- **해석**
   - Alexnet feature들을 이전 방법에 적용시키면 더 좋은 성능

![](https://velog.velcdn.com/images/ha_yoonji99/post/a3c88ac1-0fa9-447b-bb2e-041d5afe06fb/image.png)


- **해석**
    - **imageNet에서 feature추출한 pretrained model로 → feature벡터위에 NN적용**
        = transfer learning으로는 젤 간단한 예시 (단순히 feature vector추출하고 사용)

    - 최근접이웃 방법으로 image 복구작업 수행</code></pre><p><strong>3) Bigger dataset: Fine-Tuning</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/54fc1d9a-669a-467a-a76a-9230c81bfcf4/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><p>마지막 layer버리고, 새 layer(새로운 데이터셋의 분류 category와 관련되도록 초기화)로 대체
  = <strong>모델 전체를 새 분류 dataset에 맞춰 다시 학습</strong></p>
</li>
<li><p>고정된 feature 추출기X, 실제 모델로 역전파하며 모델 가중치 계속 update → downstream에서의 성능 개선</p>
</li>
</ul>
</li>
<li><p><strong>downstream 성능 향상 위한 trick &amp; tips</strong></p>
<ul>
<li><strong>먼저 feature extraction → 그 위에 linear model학습 → 전체 모델 다시 fine tuning</strong></li>
<li>fine tuning진행 시, LR을 크게 감소시켜야 할수도 있음</li>
<li>컴퓨팅 비용을 아끼기 위해 low layer를 freeze해라.</li>
</ul>
</li>
<li><p><strong>성능 비교</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/e117e970-4a32-4fe4-b2e7-2254c3b31e9c/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **해석**
    - **고정된 Feature Extraction:** 전체 network freeze하고 **feature extraction**으로만
    - **fine tuning: 새로운 dataset**에 대해 전체 신경망 모델 계속 학습 → 성능 더 ↑</code></pre><p><br/><br/></p>
<hr>
<h3 id="6-after-training-transfer-learning_architecture-matters--특징-일반화">6. After Training: Transfer Learning_Architecture Matters &amp; 특징 일반화</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/9f6a629b-3e4b-462f-bfc3-4cf63734bc14/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><p><strong>imageNet에서 잘되면 다른 데서도 잘됨</strong></p>
</li>
<li><p><strong>예시</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/72d38058-0470-48d5-8874-604dab756a47/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<p><strong>1) Transfer Learning 특징 일반화</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/079b3f08-1141-436c-bd96-fc6f87dc4694/image.png" alt=""></p>
<table>
<thead>
<tr>
<th></th>
<th>매우 비슷한 dataset</th>
<th>매우 다른 dataset</th>
</tr>
</thead>
<tbody><tr>
<td>매우 적은 data</td>
<td>제일 윗계층에서 linear classifier사용</td>
<td>곤란한 상황, 여러 단계로부터 linear classifier 시도</td>
</tr>
<tr>
<td>꽤 많은 data</td>
<td>몇개의 layer 미세조정</td>
<td>더 많은 계층 fine tuning</td>
</tr>
</tbody></table>
<p><strong>2) 전이학습 활용 예시들</strong></p>
<p><strong>a. 물체 인식, image captioning</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/607014b6-e49d-4252-90d7-804f312e7bfa/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li>둘 다 CNN으로 imageNet pretrain함 + fine tuning</li>
</ul>
</li>
</ul>
<p>b.
정리 중 . . ⚠ 🚧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 10강: Training Neural Networks (Part1)]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-10%EA%B0%95-Training-Neural-Networks-Part1</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-10%EA%B0%95-Training-Neural-Networks-Part1</guid>
            <pubDate>Sat, 12 Aug 2023 03:52:18 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다.
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌</p>
</blockquote>
<hr>
<h3 id="1-activation-functions--sigmoid">1. Activation Functions : Sigmoid</h3>
<p>📍 3가지 문제점: saturated gradient, not zero-centered, 연산비용</p>
<ul>
<li><p><strong>전체 흐름</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/b4394043-37fe-4773-ad64-de984a7714ff/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **해석**
    - **axon from a neuron:** 이전 뉴런에서의 입력
    - **cell body의 f:** **activation function**으로 비선형화
        - 없으면 단일 선형 layer로 축소되므로 반드시 필요</code></pre><p><strong>1) 소개</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/f8fad69e-e03f-4bfe-8295-4c4ab0ead72b/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><p>가장 classic 함</p>
</li>
<li><p>존재 or 부재에 대한 확률적 해석</p>
</li>
<li><p>0~1사이로 만듦</p>
</li>
<li><p><strong>“Firing rate” of neuron</strong></p>
<ul>
<li><p>다른 들어오는 뉴런으로부터 신호 받은 후, 일정 속도로 신호 발화</p>
</li>
<li><p>모든 입력의 총 속도에 비선형성 의존</p>
<p>⇒ sigmoid: <strong>발화속도에 대한 비선형 의존성을 모델링</strong> 한 것</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>문제점 3가지</strong>
  a. <strong>(젤 문제)포화된(Saturated) 뉴런들이 gradient를 죽임</strong> (= 네트워크 훈련 어렵게 만듦)</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/923b1e91-5fc7-47f5-a2a9-7264531b3650/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **x가 매우 작을때**
    - **local gradient(d$\sigma$/dx)가 0에 수렴**
    - **downstream gradient(dL/dx)도 0에 수렴하게 됨**

        **→ 가중치 update도 0에 가까워짐(가중치 update행렬과 관련된 손실의 모든 기울기가 매우 낮을거라서) → 학습 느려짐**

- **x가 0일때**
- **x가 매우 클때**
    - **gradient가 0에 수렴**

        → 매우 깊은 layer일때, 하위 layer에서 gradient 훈련 신호X (걍 0이라서)</code></pre><p>  <strong>b. sigmoid output들은 zero-centered가 아님</strong></p>
<pre><code>![](https://velog.velcdn.com/images/ha_yoonji99/post/6ec7acac-4822-4647-b3c5-fcb47e3b5bab/image.png)


- (원소 1개일때) **가정**
    - **모든 input neuron이 항상 +라면 W gradient는 어떻게 될까?**
        - (local gradient)가 항상 +가 됨
        - (upstream gradient)가 항상 +가 됨 (모든 손실or 기울기가 양수, Wi에 대한 모든 손실 or 기울기가 양수)

        **⇒ W에 대한 모든 기울기가 동일 부호 갖게 됨**

        **(=모두 양, 음이 된다는 제약 때매, 가중치의 특정값에 도달하는 경사하강법 단계 만들기 어려움)**

        - **부연설명**
            ![](https://velog.velcdn.com/images/ha_yoonji99/post/880a8800-8c8d-43d1-9808-85e48fe88672/image.png)
           - W초기값이 원점이고, 손실 최소화 위한 가중치 값은 원점에서 오른쪽 하단으로 이동위해 **W1은 +단계,  W2는 -단계여야 하는데, 둘다 같은 부호면 해당 사분면에 정렬된 단계 수행방법 X**
                - **경사하강절차가 해당 방향으로 진행하는 방법**
                    - 모든 경사가 위로 이동하는 지그재그 패턴

        **⇒ 결론) not zero-centered한 문제 때문에, train시 매 update마다 한쪽에 치우치니까 매우 불안정함**


- **(원소 여러개일때) Minibatch일때**
   - **not zero-centered한 문제 완화됨**
        - 미니배치에 대해 모두를 평균내면, 때로는 양수, 음수 나올수 있어서</code></pre><p>  <strong>c. 지수함수의 계산비용이 비쌈</strong></p>
<pre><code>![](https://velog.velcdn.com/images/ha_yoonji99/post/ab3f816e-b272-4ed7-9dfd-535466c10ed2/image.png)


- 지수함수는 많은 clock cycle이 돌아서 비쌈
- cf) relu와 sigmoid 비교했을때, sigmoid가 훨 오래걸림</code></pre><p><br/><br/></p>
<hr>
<h3 id="2-activation-functions--tanh">2. Activation Functions : Tanh</h3>
<p>📍 문제점: saturated gradient
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/5bb51bed-b226-448d-a2c3-973b07d6b2c9/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>Scaled &amp; Shifted version of Sigmoid</li>
<li>[-1,1] 범위</li>
<li>zero-centered함</li>
<li><strong>여전히 saturated할때 gradient가 죽음</strong><ul>
<li>saturating non-linearity를 neural network에 사용해야된다면, <strong>tanh&gt;sigmoid</strong> 사용하는게 합리적</li>
<li>그래도 saturated 문제때매 엄청 좋은 선택X</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="3-activation-functions--relu-leaky-relu">3. Activation Functions : ReLU, Leaky ReLU</h3>
<p>📍 문제점: not zero-centered, -일때 gradient vanishing
<strong>1) relu</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/dfd6aaf0-21e5-4c30-931e-196bccaf9dc7/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><strong>+ 영역에서 saturate되지 않음 (=기울기 소실X, killing gradient X)</strong></li>
<li><strong>연산 비용 효율적 (cheapest 비선형함수)</strong><ul>
<li>cf) binary와 같이 구현가능, 간단한 임계값만 고려해서 계산비용↓</li>
</ul>
</li>
<li><strong>sigmoid, tanh보다 매우 빨리 수렴</strong><ul>
<li>cf) 5000 layer같이 매우 깊은 layer면, sigmoid로 수렴하기 매우 힘들것 (batch norm 안쓸때)</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>문제점</strong></p>
<ul>
<li><p><strong>Not zero-centered output (sigmoid와 동일문제)</strong></p>
<ul>
<li>relu는 음수X, 모두 + or 0임</li>
<li>이런 문제가 있긴하지만 gradient vanishing처럼 심각한 문제는 아니라 괜찮음</li>
</ul>
</li>
<li><p><strong>음수일때의 기울기 문제</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/48ef0c06-b87d-4872-8735-af7bcbdacb38/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - **x가 매우 작을때 (dead relu; x&lt;0이면 완전히 학습X)**
        - **local gradient(d$\sigma$/dx)가 0**
        - **downstream gradient(dL/dx)도 0**
            - cf) 그러면 sigmoid보다 더 안좋은것 아닌가? (sigmoid는 0에 수렴하는데 여기선 아예 0인데?)

                → 그래도 completely 0이 아녀서 학습 가능

    - x가 0일때
    - x가 매우 클때
        - **local gradient(d$\sigma$/dx)가 1**

    - cf) **Dead relu, Active relu**

        ![](https://velog.velcdn.com/images/ha_yoonji99/post/69241d15-ae2f-41d1-a181-ea586a0da560/image.png)


        - **active relu**
            - gradient 받고 정상적으로 train함
        - **dead relu**
            - 이 문제는 **모든 데이터가 음수**일때 발생, 일부가 + 이면 ㄱㅊ
            - **절대 train 불가**
            - **극복 방법 (trick)**
                - 0.01같이 조금의 positive 기울기로 초기화 (Leaky relu)</code></pre><p><strong>2) Leaky relu</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/84777614-9bc1-4da0-a4a9-3a5d9b3b478c/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>음수일때 작은 + 를 포함함</li>
<li>0.01 → hyperparameter임 (각자의 network에 맞게 학습 필요)</li>
</ul>
</li>
<li><strong>장점</strong><ul>
<li>saturate되지 않음</li>
<li>효율적 연산 비용</li>
<li>sigmoid, tanh보다 훨씬 빠른 수렴속도</li>
<li><strong>gradient vanishing되지 않음</strong> ( local gradient가 0이 될 일이 없어서; 음, 양 모두에서)</li>
</ul>
</li>
</ul>
<p><strong>3) PReLU</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/5bc310fd-c36a-4bf6-af73-792f6f9f048e/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>leaky relu에서 이어진 것</li>
<li>$\alpha$ 를 학습해서 알맞게 가져옴 (learnable parameter)</li>
<li>스스로 학습 파라미터를 갖고 있는 비선형 함수</li>
</ul>
</li>
<li><strong>backprop into \alpha</strong><ul>
<li>$\alpha$에 backprop해서 $\alpha$에 대한 손실 도함수 계산 후, $\alpha$에 대한 gradient decent step 만들기</li>
<li>문제점) 0에서 미분 불가능 → 해결) 두 방향 중 한 쪽을 고르기 (자주발생X여서 신경안써도됨)</li>
</ul>
</li>
</ul>
<p><strong>4) ELU (Exponential Linear Unit)</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/7ee3c54c-bf32-496c-9f13-d1be5db658ef/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>relu보다 더 부드럽고, zero-centered 경향 ↑</li>
</ul>
</li>
<li><strong>수식</strong><ul>
<li>$\alpha(exp(x)-1)$     (if x≤0)<ul>
<li>(<em>default $\alpha$=1)</em></li>
<li>zero-gradient 피하기 위함</li>
<li>약간 sigmoid 모양</li>
</ul>
</li>
</ul>
</li>
<li><strong>문제점</strong><ul>
<li>여전히 <strong>지수함수</strong> 포함</li>
<li>$\alpha$ 때매 <strong>학습해야됨</strong></li>
</ul>
</li>
</ul>
<p><strong>5) SELU (Scaled Exponential Linear Unit)</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ead6fabd-84ac-460a-8fba-795726a9ff2b/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>Scaled version of ELU</li>
<li>batch norm 제외하고, 깊은 SELU 네트워크 학습 가능</li>
</ul>
</li>
<li><strong>장점</strong><ul>
<li>deep neural network + SELU = self normalizing property
  = <strong>layer가 깊어질수록 → 자기 정규화 속성 ↑</strong>
  <strong>= 활성화 함수 잘 작동 ↑ &amp; 유한한 값으로 수렴</strong>
  <strong>= batch norm과 같은 정규화 제외 가능</strong></li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="4-activation-functions--전체-비교">4. Activation Functions : 전체 비교</h3>
<ul>
<li>걍 relu써라</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/a37e881c-38d8-49ce-ab6d-61bee14a6ef8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/b9833d93-8bc6-4b15-ad35-b73be3d9d282/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="5-data-preprocessing">5. Data Preprocessing</h3>
<p><strong>1) 개념</strong></p>
<ul>
<li>더 <strong>효율적</strong> training 위해</li>
</ul>
<p><strong>2) 방법 2가지</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ec4d2284-164a-46aa-8b96-e0b5b735eb79/image.png" alt=""></p>
<p>(image data인 경우) </p>
<p>a. <strong>zero-center :</strong> 평균을 빼서 원점으로 가져옴</p>
<ul>
<li><p><strong>이렇게 해야 하는 이유?</strong></p>
<ul>
<li><p>이전에 sigmoid의 문제점으로 gradient가 항상 + or -면, W update도 항상 + or - 되는 문제 지님</p>
</li>
<li><p>비슷하게, 여기서도 train data가 모두 + or - 면, W update도 모두 항상 + or -.</p>
</li>
<li><p><em>⇒ 제한적으로 update될 수 밖에 없음*</em></p>
</li>
</ul>
</li>
</ul>
<p>b. <strong>normalized :</strong> 동일 분산 갖도록 크기 scaling (표준편차로 나눠서)</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/512ec9ad-1245-4679-b9a2-18c1ed41cf43/image.png" alt=""></p>
<p><em>(input이 저차원, 이미지 아닌 경우)</em></p>
<ul>
<li><p>원점 중심으로 옮기고 → rotate함</p>
</li>
<li><p><strong>decorrelated data</strong></p>
<ul>
<li>공분산 matrix ?</li>
</ul>
</li>
<li><p><strong>whitened data</strong></p>
<ul>
<li>identity matrix</li>
</ul>
</li>
<li><p><strong>normalize 전, 후 비교</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/337431ea-5091-4602-9589-b0065f53a8c5/image.png" alt=""></p>
</li>
</ul>
<pre><code>- *(before norm)* **원점으로부터 멀면, weight matrix의 작은 변화에도 큰 변화 발생**→ *optimization process 어렵게 만듦*
    - ex. -2x+1 일때  zero-centered 되지 않으면, 함수가 -2.1x+1로 바뀔때, 데이터 분류 상황이 많이 바뀜 → classification loss 많이 변화 → optimization process 어렵게 만듦
- *(after norm)* zero-centered 되어있어서, **W의 작은 변화에 덜 민감**</code></pre><p><strong>3) 관련 질문들</strong></p>
<ul>
<li><p><strong>Q1. 이런 전처리를 train, test에 적용?</strong>
  A1. 항상 train에 적용, test에서는 같은 정규화 사용</p>
</li>
<li><p><strong>Q2. batch-norm사용시에도 전처리 필요?</strong>
  A2. batch norm을 모든 처리 이전 맨 첫단계에서 사용시 안해도 됨.
  but 전처리를 직접 하는거 보단 성능 낮을듯
  ⇒ 실무에선 전처리 → batch norm 둘다 사용</p>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="6-weight-초기화">6. Weight 초기화</h3>
<p>📍 Xavier 출현배경 + Xavier에 대해
<strong>1) 방법 3가지 (모두 문제있음)</strong></p>
<p>  <strong>a. W=0, b=0으로 초기화</strong> </p>
<ul>
<li><p><strong>문제점</strong></p>
<ul>
<li><strong>모든 output들이 0이되고, 모든 gradient가 동일해짐</strong>
   = output은 input과 관련이 없어짐 ⇒ gradient =0이 돼서 totally stuck됨</li>
<li><strong>대칭이 깨지지X</strong> (계속 같은 gradient 학습) → 학습 불가됨</li>
</ul>
</li>
<li><p><em>b. small random 숫자들로 초기화*</em></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/f40ca181-d7c4-4e1f-8e42-e31f709d7896/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>문제점</strong></p>
<ul>
<li><p>deeper network에서 문제 발생
  = <strong>local gradient들이 모두 0이 됨 → downstream gradient도 0이 돼서 학습 X</strong></p>
<ul>
<li><p><strong>증명</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/f56bb82c-f0d7-4921-973e-21105116b6b1/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li>각 6개의 layer의 hidden unit값들을 시각화한것</li>
<li><strong>hidden state</strong> = W가 Din, Dout의 사이에 small random값으로 초기화 되어 x와 내적한값</li>
<li>이 hidden state들의 기울기가 점점 0에 수렴하게 됨<ul>
<li>cf) <strong>weight의 local gradient = 이전 layer의 activation</strong><ul>
<li><strong>결과</strong></li>
</ul>
</li>
</ul>
</li>
<li>layer가 깊어질수록 activations가 0에 수렴 (학습에 매우 bad)
  <strong>⇒ local gradient들이 모두 0이 됨 → downstream gradient도 0이 돼서 학습 X</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>  <strong>c. W를 조금 더 큰 숫자로 초기화</strong></p>
<ul>
<li><p><strong>문제점</strong></p>
<ul>
<li><p><strong>local gradient들이 모두 0이 됨 → downstream gradient도 0이 돼서 학습 X</strong></p>
<ul>
<li><p><strong>증명</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/526552eb-c41b-42c0-aa19-3081b9ff2ecd/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li>tanh로 인해 극단값으로 밀려남<ul>
<li><strong>결과</strong></li>
</ul>
</li>
<li>local gradient들이 모두 0이 됨 → downstream gradient도 0이 돼서 학습 X</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>2) 해결 방법</strong> </p>
<p><strong>a. Xavier Initialization</strong></p>
<ul>
<li><p><strong>방법</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/f82c757f-7dbb-4ae4-af5f-ff2979980126/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **std = 1/sqrt(Din)**
- 하이퍼파라미터 X</code></pre><ul>
<li><p><strong>결과</strong></p>
<p>  !<img src="https://velog.velcdn.com/images/ha_yoonji99/post/da4675d3-434d-4328-8101-7c66c6895836/image.png" alt=""></p>
</li>
</ul>
<pre><code>- layer가 깊어져도 ㄱㅊ음</code></pre><ul>
<li><p><strong>conv layer에서 적용 방법</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/c818dfbb-1040-4b4f-9adc-6c73c77e28af/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>도함수</strong></p>
<ul>
<li><p><strong>Xavier의 목표</strong></p>
<ul>
<li><p>output 의 activation 분산 =  input의 activation 분산 하기!
  <em>(왜냐면 기존 초기화 방법들은  input과 output의 분산이 달라서 문제였어서)</em></p>
</li>
<li><p><strong>증명</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/fc87362e-ee2b-4a2a-9d75-3c591c12ff9d/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>        - **가정**
            - x,w는 모두 가우시안 분포를 따른다. (0 분산)
        - **결과**
            - **Var($w_i$) = 1/Din 이면, Var($y_i$) = Var($x_i$)이다**

            **⇒ 따라서 Xavier 초기화 = 1/sqrt(Din) 이 된 것.**</code></pre><ul>
<li><p><strong>cf) ReLU로 input x와 W를 내적한다면?</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/1f240c26-803a-4032-a9af-b5d85b532999/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **결과**
    - **Xavier에서 relu 작동 X**
        - 이유) Xavier는 x와 w가 zero-mean임을 가정하는데 relu는 그렇지 않아서 맞지 않음</code></pre><p><br/><br/></p>
<hr>
<h3 id="7-weight-초기화--kaiming--msra-초기화">7. Weight 초기화 : Kaiming / MSRA 초기화</h3>
<p>📍 relu그대로 사용대신, w초기화 방법 변경 → resnet에서 안맞는 부분 해결
<strong>1) 방법</strong></p>
<ul>
<li>relu그대로 사용, 대신 weight초기화 변경</li>
<li><strong>(기존) std=1/sqrt(Din) → (변경) std=sqrt(2/Din)</strong><ul>
<li>relu는 반을 죽이니까 걍 2배를 해도 됨 (뉴런의 절반이 죽을거라는 사실에 대해 조정)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/570d397c-45f3-4d39-bec6-4c69668c2895/image.png" alt=""></p>
<p><strong>2) 문제점</strong></p>
<ul>
<li><p>VGG를 scratch 내면서 train 시킴 (지적받음)</p>
</li>
<li><p><strong>Residual Network에선 유용 X</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/fb9ed074-aee8-4073-96d3-1625d92f2641/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **이유: residual connection 이후의 output에 input을 다시 넣어서 분산, 분포가 엄청 클 것**
    - ex. Var(F(x))(1번째 output에 대한 분산) **=** Var(x)(input에 대한 분산) *(여기까진 정상)*

        Var(F(x)+ x)(2번째 output에 대한 분산) **&gt;&gt;** Var(x)(input에 대한 분산) *(residual로 input을 다시 넣어줘서 분산이 더 큼, 일치X)*

- **따라서, Xavier or MSRA에서 분산이 매우 크므로 → bad gradient → bad optimization**</code></pre><p><strong>3) 해결책</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6d677d17-c974-42b2-9a1f-d1b07794dc9e/image.png" alt=""></p>
<ul>
<li>첫번째 conv를 MSRA로 초기화</li>
<li>두번째 conv (last layer)를 0으로 초기화</li>
</ul>
<p><strong>⇒ Var(x+F(x)) = Var(x) 일치 가능</strong></p>
<p><strong>= 분산이 너무 커지지 않을수있음</strong></p>
<p><strong>4) 질문</strong></p>
<ul>
<li><strong>Q. (W 초기화 목적) 초기화의 idea가 손실함수의 global minimum에 도달하기 위함인가?</strong>
  A. 아님, train 전엔 그 minimum이 어딘지 모름, 대신 모든 gradient가 초기화를 잘 행할 수 있도록 하는 것
  <strong>= 잘못된 초기화 하면 zero gradient가 되어버릴 수 있어서</strong>
  <strong>= lost landscape에서 flat한 곳에서 시작하여 걸어가지(train) 않도록 도와주는 작업</strong></li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="8-regularization--dropout">8. Regularization : Dropout</h3>
<p><strong>1) 사용 목적</strong></p>
<ul>
<li><p>과적합 방지</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/85be112f-cee3-40c4-8514-8d30d53fb78f/image.png" alt=""></p>
</li>
</ul>
<p><strong>2) 방법</strong></p>
<p><strong>a. Loss뒤에  $\lambda$$R(W)$ 붙이기</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/67bc884b-3fd2-4ec9-b7b9-cb101e1c3334/image.png" alt=""></p>
<ul>
<li>L2 norm → 젤 사용 多</li>
</ul>
<p><strong>b. Dropout</strong></p>
<ul>
<li><p><strong>방법</strong></p>
<ul>
<li><p><strong>각 layer마다 순전파 시, 랜덤하게 몇몇 뉴런들을 0으로 세팅</strong></p>
</li>
<li><p>얼마나 drop할건지는 <strong>hyper parameter</strong>임; 0.5가 일반적</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/ed004288-32c7-48d6-ac9e-8d5f580ffd04/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>구현하기</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/bee86b29-52dd-4a8d-8599-9cc116cce7f8/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>Dropout하는 이유 2가지</strong></p>
<ul>
<li><p><strong>중복 적용하는 것 방지</strong>
  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/8c11ac36-2a2a-4a2a-85e3-32bd2e4229dd/image.png" alt=""></p>
<ul>
<li>x의 feature잘 학습 위해, <strong>필요없는 feature 덜 배우고 중복 노드 배우는걸 방지</strong></li>
</ul>
</li>
<li><p><em>⇒ 결론) 과적합 방지*</em></p>
</li>
<li><p><strong>앙상블처럼</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/9deeaaa6-9715-421f-8de0-1d68f5f999a7/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - Dropout은 파라미터 공유하는 **여러 Neural Network 앙상블 training**
    - 여러 submodel 만들어서, **앙상블처럼 최종 결론 투표 결정**</code></pre><ul>
<li><p><strong>Test Time에서의 Dropout</strong></p>
<ul>
<li><p><strong>문제점</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/448a0072-d3f0-4c31-998d-abd26dec9e88/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - **z**=random변수 (순전파 이전에 정함)
    - **결론) test시, random하게 뉴런을 끄게 되면 test마다 결과가 다 다르게 도출**

        이유) 각 forward pass마다 random하게 뉴런 떨어트려서

- **해결책**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/9e08c8c1-706a-4d1c-a13e-467d70aa3baf/image.png)


    - 이러한 randomness (**z**) 를 **평균**내자!

- **해결방법**
    - **위의 integral 근사화 하는 방법**

        ![](https://velog.velcdn.com/images/ha_yoonji99/post/e7499c3d-b8d8-405c-ae50-fbe0b0424548/image.png)


        - ***(dropout시)* 4개의 각기 다른 train시에 만들어진 random mask들 곱해짐**
            → **z** (random 변수)에 대해서 평균내는 것


- **구현**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/67431721-9a30-4917-bede-d6c2f089363c/image.png)


    - **방법**
        - test time에선 모든 뉴런들 사용
        - **but 각 뉴런을 drop할때 dropping 확률(p) 써서 layer의 output을 rescale함**</code></pre><ul>
<li><p><strong>결론(전체 구현)</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/1ac37b22-960e-4b25-b5a5-73a5a27cbfc6/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **train**: 걍 그대로 dropout
- **test**: 적절한 확률(p) 사용해서 output을 rescale하고, randomness없앰
    - *각 개별 layer에만 적용 가능*
    - *stacking multiple dropout layer시 사용X*</code></pre><ul>
<li><p><strong>일반적인 구현 방법 (Inverted Dropout)</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/4a4bab79-e4b9-4ac0-8ca2-f24f913c13be/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 일반적으로,, **train**시 drop &amp; scale 모두 함(뉴런을 1/2개 dropout시키고 남은 뉴런들을 2배함 )

    **test**시에 모든 뉴런 사용 + 모든 normal weight matrix 사용</code></pre><p><br/><br/></p>
<hr>
<h3 id="9-dropout-architectures">9. Dropout architectures</h3>
<p>📍 Dropout이 아키텍처들에 어케 쓰이는지
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/25c84392-daca-4a45-83a0-42a41f86bc6f/image.png" alt=""></p>
<ul>
<li><strong>결론</strong><ul>
<li><strong>AlexNet, VGG</strong> : 맨 윗단 레이어인 FCLayer에서 dropout적용</li>
<li><strong>이외 최신 아키텍처</strong>: FCLayer를 줄였기에, dropout 사용할일 거의 없음</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="10-regularization--a-common-pattern">10. Regularization : A common pattern</h3>
<ul>
<li><p><strong>Batch norm</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/dd07e5db-95c8-4644-9832-f59d61d3cd50/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **train (randomness추가)**
    - **랜덤 확률로** **미니배치** 사용해서 정규화
- **test (**average out randomness)
    - **고정된 확률**로 정규화</code></pre><ul>
<li><p><strong>최신 아키텍처에는…</strong></p>
<ul>
<li><p><strong>dropout 사용X</strong></p>
<p>  <strong>→ 대신 batch norm or L2 정규화</strong></p>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="11-regularization--data-augmentation">11. Regularization : Data Augmentation</h3>
<p>📍 좌우대칭, 밝기조절 등</p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/0ca380b8-06ad-4dda-811b-1bd5130da86e/image.png" alt=""></p>
</li>
</ul>
<pre><code>- input data에 randomness를 부여하는 방법의 일종
- **비슷한 image이지만 CNN모델은 다른 이미지로 인식하며, 밝기조절 or 좌우 대칭 등을 randomness의 일종으로 볼 수 있음**</code></pre><ul>
<li><p><strong>방법</strong></p>
<ul>
<li><p><strong>Horizontal Flips (좌우 대칭)</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/13d3fcfe-0585-425a-82af-030378c7769c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- **Random Crops &amp; Scales (랜덤 자르기, 사이즈 조절)**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/59c54463-3b9d-46d3-b34d-7fd9c975e4f7/image.png)


    - **train**
        - 랜덤하게 이미지 잘라내고, 사이즈 조정
    - **test**
        - test용 이미지를 5개의 스케일로 만든 후, 224*224 사이즈의 이미지를 10개로 크롭하여 10개에 대한 분류 결과 투표시킴

- **Color Jitter**
    - RGB 픽셀에 대해 PCA 진행하여, 조도 조절하는 방법

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/23e624b0-efbb-42a4-bdf2-61912246752d/image.png)</code></pre><p><br/><br/></p>
<hr>
<h3 id="12--regularization--drop-connect">12.  Regularization : Drop Connect</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/616cb267-cc64-452e-af01-ce907bfa8011/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="13--regularization--fractional-pooling">13.  Regularization : Fractional Pooling</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/8a2f1740-4a08-4a85-99de-d1407ca8ae9c/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="14-regularization--stochastic-depth">14. Regularization : Stochastic Depth</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/b484718e-bf5f-4464-95cc-2c72751fb5f2/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="15-regularization--cut-out">15. Regularization : Cut out</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/3d95d9f6-8536-4eb9-9947-405adba102f4/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="16-regularization--mix-up">16. Regularization : Mix up</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/19db1384-00d2-4da9-a30e-6810a9edd1f4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 8강: CNN Architecture]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-8%EA%B0%95-CNN-Architecture</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-DLcs231n-8%EA%B0%95-CNN-Architecture</guid>
            <pubDate>Sat, 12 Aug 2023 03:10:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다. 
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌</p>
</blockquote>
<hr>
<h3 id="1-imagenet-classification-challenge">1. ImageNet classification Challenge</h3>
<p><strong>1) 개념</strong></p>
<ul>
<li><p>엄청 큰 규모 dataset</p>
</li>
<li><p>이미지 분류에 대한 큰 bench mark</p>
</li>
<li><p>CNN설계에서 많은 시사점 남김</p>
</li>
<li><p>2010, 2011년 → Neural Network base X</p>
<p>  2012년 → CNN이 첨으로 거대한 주류가 되던 해 (AlexNet이 압도함)</p>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="2-alexnet">2. AlexNet</h3>
<p>📍 계산구조 시사점: 초기 메모리多,파라미터수(fc layer)에서, 계산비용(conv에서 多)
<strong>1) 설계</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/cb28590d-99a3-43ba-9048-48e343693d9d/image.png" alt=""></p>
<ul>
<li>227 * 227 inputs</li>
<li>5 conv layers</li>
<li>Max pooling</li>
<li>3 fully-connected layers</li>
<li>relu 비선형 함수</li>
</ul>
<p><strong>2) 단점</strong></p>
<ul>
<li><strong>Local response normalization</strong>사용 <em>(현재는 사용X, batch norm의 선구자)</em></li>
<li><strong>2개의 GTX 580 GPU</strong>에 학습됨<ul>
<li>각각 <strong>3GB</strong> 밖에 안됨 (현재는 12-18GB)</li>
<li>GPU 메모리에 맞추기 위해 <strong>2개의 서로 다른 물리적 GTX카드</strong>로 분산됨
  (GPU 여러개로 분할은 현대에서도 가끔 사용하지만 주로 사용X)</li>
</ul>
</li>
</ul>
<p><strong>3) citations(인용횟수)</strong></p>
<ul>
<li><p>모든 과학분야에서 젤 인용 多</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/3ec68082-cdac-4752-b467-9b0d57d0473b/image.png" alt=""></p>
</li>
</ul>
<p><strong>4) 계산 구조</strong></p>
<p><strong>a. Conv Layer</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/cbacb99f-5a38-4ed1-a3a3-7866b3258ee7/image.png" alt=""></p>
<ul>
<li><p><strong>C=3</strong>
  : RGB</p>
</li>
<li><p><strong>input size; H/W=227</strong>
  : input size</p>
</li>
<li><p><strong>filters=64</strong>
  : <strong>output size의 channel</strong>과 같아야 됨 </p>
</li>
<li><p><strong>output size; H/W=56</strong>
  <strong>: ((W-K+2P)/S)+1</strong>
  → ((227-11+4)/4)+1 = 56</p>
</li>
<li><p><strong>memory(KB)=784</strong>
  : <strong>(number of output elements) * (bytes per element) / 1024</strong>
  → (64<em>(56</em>56))*4/1024 = 784</p>
</li>
<li><p><strong>params(k) = 23 (학습가능 파라미터 수)</strong>
  : <strong>number of weights</strong>
  <strong>=(weight shape)+(bias shape)</strong>
  = <strong>(Cout<em>Cin</em>k*k) + Cout</strong>
  = (64<em>3</em>11*11) + 64 = 23,296</p>
</li>
<li><p><strong>flop(M) = 73 (총 연산수 = 부동 소수점 연산수)</strong>
  : <strong>Number of floating point operations(multipy+add)</strong>
  <strong>= (number of output elements)*(1개의 output elem당 연산 수)</strong>
  = <strong>(Cout<em>H’</em>W’) * (Cin<em>k</em>k)</strong>
  = (64<em>56</em>56) * (3<em>11</em>11)
  = 72,855,552</p>
</li>
</ul>
<p><strong>b. pooling layer</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/d077ce25-72be-4032-a034-cb8c09bc1132/image.png" alt=""></p>
<ul>
<li><p><strong>Cin = Cout = 64</strong></p>
</li>
<li><p><strong>output size; H/W = 27</strong>
  <strong>: ((W-K+2P)/S)+1</strong>
  = 27.5 (Alexnet은 항상 나눠떨어지지x)
  = floor(27.5)=27 걍 내림함</p>
</li>
<li><p><strong>memory(KB) = 182</strong>
  : <strong>(number of output elements) * (bytes per element) / 1024</strong>
  = 182.25</p>
</li>
<li><p><strong>params(k) = 0</strong>
  <strong>: pooling layer에는 learnable parameter 없음</strong></p>
</li>
<li><p><strong>flop(M) = 0</strong>
  : <strong>Number of floating point operations(multipy+add)</strong>
  <strong>= (number of output positions)*(1개의 output position당 연산 수)</strong>
  = <strong>(Cout<em>H’</em>W’) * (k*k)</strong>
  = 0.4 MFlop</p>
</li>
</ul>
<p><strong>c. flatten</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/f9182f69-a548-4959-a7b5-b5dac3d03e1f/image.png" alt=""></p>
<ul>
<li><strong>flatten output size = 9216</strong> (모든 공간구조 파괴, 벡터로 평면화)
  <strong>: Cin * H * W</strong>
  =256<em>6</em>6 = 9216</li>
</ul>
<p><strong>d. FC</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/99cd6899-22ba-453d-b09d-0ca2e08a2a6d/image.png" alt=""></p>
<ul>
<li><p><strong>FC params</strong>
  <strong>: Cin * Cout + Cout</strong>
  = 9216 * 4096 + 4096
  = 37,725,832</p>
</li>
<li><p><strong>FC flops</strong>
  <strong>: Cin * Cout</strong>
  = 9216 * 4096
  = 37,748,736</p>
</li>
</ul>
<p><strong>5) 위 계산에서 알 수 있는 특징</strong></p>
<ul>
<li>시행착오적</li>
<li>지금은 사용 적음</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/e0712909-6c27-4cb7-a849-34ea0465f9d7/image.png" alt=""></p>
<p><strong>a. Memory 사용량</strong></p>
<ul>
<li><strong>초기에 메모리 多</strong><ul>
<li><strong>이유)</strong> 초기 conv layer의 output이 상대적으로 높은 공간 해상도와 많은 수의 filter가져서</li>
</ul>
</li>
</ul>
<p><strong>b. parameter 수</strong></p>
<ul>
<li>모든 파라미터들은 <strong>fc layer에 존재</strong><ul>
<li><strong>이유)</strong> 6<em>6</em>256의 tensor 가지고 있고, 4096의 숨겨진 차원으로 완전히 연결되어 있어서<ul>
<li>Alexnet의 모든 learnable parameter가 fully connected layer에서 나옴</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>c. 계산 비용</strong></p>
<ul>
<li><strong>conv layer에서 연산량 多</strong><ul>
<li><strong>이유)</strong> 계산 비용은 fc에서는 별로 안큼.(걍 곱하기만 해서)
  반면 conv layer에는 filter수가 많고, 높은 공간 해상도면 계산비용 ↑</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="3-zfnet-bigger-alexnet">3. ZFNet: Bigger AlexNet</h3>
<p>📍 계산구조 시사점: 더 큰 네트워크가 더 성능 good
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/4f296d1c-4c10-46e7-afe3-d733e9302eb5/image.png" alt=""></p>
<p><strong>1) 특징</strong></p>
<ul>
<li>more trial, less error</li>
</ul>
<p><strong>2) AlexNet과 바뀐 점</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/509520c6-3063-401f-9001-34946bf33891/image.png" alt=""></p>
<ul>
<li><strong>conv1</strong><ul>
<li><strong>(11x11 stride 4) → (7x7 stride 2)로 바뀜</strong><ul>
<li>기존 4만큼 down sample → 2만큼 down sample로 바뀜</li>
<li><strong>높은 공간 해상도 &amp; 더 많은 receptive field &amp; 더 많은 컴퓨팅 비용</strong></li>
</ul>
</li>
</ul>
</li>
<li><strong>conv3,4,5</strong><ul>
<li><strong>(384,384,256 filters) → (512,1024,512)로 바뀜</strong><ul>
<li><strong>filter 크게 = 네트워크 더 크게</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>=⇒ 결론) 더 큰 네트워크가 더 성능이 좋다</strong></p>
<p><br/><br/></p>
<hr>
<h3 id="4-vgg-deeper-networks-regular-design">4. VGG: Deeper Networks, Regular Design</h3>
<p>📍 계산구조 시사점: 굳이 큰 필터 필요X, conv layer개수 더 중요, 채널 수 많아져도 계산비용 동일 - Stage 사용
<strong>1) AlexNet, ZFNet 공통 문제점</strong></p>
<ul>
<li>ad hoc way (네트워크 확장, 축소 어려움)</li>
<li>hand design 맞춤형 convolution architecture</li>
</ul>
<p><strong>⇒ VGG는 네트워크의 동일한 조건으로 전체 적용 (단순화함)</strong></p>
<p><strong>2) VGG 설계 규칙 (정확한 구성에 대해 생각X)</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/d3e8958e-b57d-4b59-86fd-b3ca1ce23cf6/image.png" alt=""></p>
<ul>
<li><p><strong>기본 세팅</strong></p>
<ul>
<li>All conv are 3x3 stride 1 pad 1</li>
<li>All max pool are 2x2 stride 2</li>
<li>After pool, double channels</li>
</ul>
</li>
<li><p><strong>stage</strong></p>
<ul>
<li><p>Alexnet은 5개의 conv layer있었고, VGG는 더 깊게 한것</p>
</li>
<li><p><strong>1개의 stage = conv, pooling layer등 포함</strong></p>
</li>
<li><p><strong>VGG: 5개의 stage</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/13b216a2-3999-4333-b730-d96048bb9d08/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<p><strong>3) 특정 설계 규칙 채택 이유</strong></p>
<p><strong>a. conv layer</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/37617323-27b1-4b90-b3c0-6b41cf8d011a/image.png" alt=""></p>
<ul>
<li><p><strong>기존: learnable parameter여서 매번 달라짐</strong></p>
<p>  <strong>→ conv = 3x3 으로 고정시킨 것</strong></p>
</li>
<li><p><strong>증명</strong></p>
<ul>
<li><p><strong>가정1:</strong> 1개의 conv layer + 5x5 kernel size 일때,</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/8dbee13a-03a4-4033-995b-0d4dc8ebf3cc/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    conv(5x5, C→C) = (kernel, input → output) 

    **params = $25C^2$, FLOPs =** $25C^2HW$

    (C개의 conv filter 가지고 있어서)

- **가정2:** 2개의 conv layer + 3x3 kernel size 일때,

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/a1864905-f126-40ae-a730-c4a3895b008c/image.png)


    **params = $18C^2$, FLOPs =** $18C^2HW$

    (각각 $9C^2$ 씩)

- **결론**

**⇒ 가정2의 더 작은 kernel size에 더 많은 conv layer개수가 파라미터 개수나, 연산량 면에서 효율적**

- 단일 5x5 conv 보다 good</code></pre><p>=⇒ <strong>굳이 큰 필터 필요X → hyperparameter로 kernel size 신경 필요X → conv layer수만 신경</strong></p>
<p><strong>b. pooling layer</strong> </p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/fa1a175c-9e31-47a7-b32d-3fc5f7810d8b/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><strong>pool 할때마다 채널 수 2배로</strong></li>
</ul>
</li>
<li><p><strong>증명</strong></p>
<ul>
<li><p><strong>stage 1</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/78d487c9-cd41-447a-a50b-a80ce322dd94/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- **stage 2**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/8722aa38-b762-4ab6-9c55-bf76a1fd6c4f/image.png)


- **결론**

    =⇒ **채널 수 많아져도, 메모리 2배 감소, 계산 비용 동일**</code></pre><p><strong>4) AlexNet vs VGG-16</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/b5238811-8d85-4e50-9cd6-9befc6715ba1/image.png" alt=""></p>
<p>⇒ <strong>결론) 네트워크 ↑ → 성능 ↑</strong></p>
<p><strong>5) 질문</strong></p>
<p><strong>Q. VGG도 multiple GPU사용?</strong></p>
<p>A. multiple GPU있었지만, 데이터 병렬처리로 배치분할 &amp; 배치별로 다른 GPU에서 계산</p>
<p>→ 모델 분할 X, 미니배치 분할O</p>
<p><br/><br/></p>
<hr>
<h3 id="5-googlenet-focus-on-efficiency">5. GoogLeNet: Focus on Efficiency</h3>
<p>📍 Stem, Inception Module, Global Average pooling, Auxiliary Classifier</p>
<ul>
<li>기존) network커지면 : 성능 더 좋음</li>
</ul>
<p><strong>1) 개념</strong></p>
<ul>
<li>효율성에 초점 ⇒ 전체적인 복잡성 최소화</li>
</ul>
<p><strong>2) Stem network</strong> </p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>input image를 엄청나게 down sampling함 (경량의 stem 이용)</li>
<li>몇개의 layer만으로 <strong>매우 빠르게 down sampling</strong>가능</li>
<li>값비싼 convolution 수행필요X</li>
</ul>
</li>
<li><p><strong>구조</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/ade91350-93e1-4e62-8a96-c9c4e01e67b5/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>VGG와의 비교</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/7b8ece0a-d28f-414c-ab73-d728be2f6a21/image.png" alt=""></p>
</li>
</ul>
<pre><code>- VGG가 GoogleNet보다 18배 더 비쌈</code></pre><p><strong>3) Inception Module</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>전체 네트워크에서 반복되는 로컬 구조</li>
<li>기존의 conv-conv-pool의 구조처럼, GoogleNet은 작은 inception module design해서 <strong>전체 네트워크에서 반복</strong></li>
</ul>
</li>
<li><p><strong>구조</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/0db3ddfb-fa35-413d-a778-440b9dafdc40/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 3x3 max pooling stride 1

![](https://velog.velcdn.com/images/ha_yoonji99/post/1c87c91e-b41d-455b-8726-2267d4cc8e26/image.png)</code></pre><ul>
<li><strong>기능</strong><ul>
<li><strong>기능1</strong><ul>
<li>기존의 <strong>kernel size를 대신하여 3x3 stack으로 대체</strong>할 수 있단것</li>
<li>hyper parameter로 kernel size제거 (항상 모든 kernel size 수행할 것이므로)</li>
</ul>
</li>
<li><strong>기능2</strong><ul>
<li>더 비싼 conv (3x3…) 사용전에 <strong>1x1 conv사용하여, 채널 수 줄임</strong> (bottleneck현상 활용)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>4) Global Average Pooling</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>파라미터를 줄여야하므로</li>
<li>평탄화하여 공간정도 파괴하기보다, 전체에 대한 average pooling으로 <strong>공간 차원 축소한 뒤 FC Layer 한번 사용</strong></li>
</ul>
</li>
<li><p><strong>구조</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/88d92bd5-17c4-4b55-bf5b-16f39c010ccb/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>VGG와 비교</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/de5e8f60-7ef3-456f-b378-d0c16878acb0/image.png" alt=""></p>
</li>
</ul>
<p><strong>5) Auxiliary Classifiers (보조 분류기)</strong></p>
<ul>
<li><strong>개념</strong><ul>
<li>Batch norm 발생전에 생김<ul>
<li>10개 이상 layer가 있을때 train하기 어려웠음</li>
<li>10개 이상 layer train 위해서 <strong>ugly hacks</strong>에 의존해야 했음</li>
</ul>
</li>
<li>Network 깊이가 깊을때, <strong>중간 layer의 학습 돕기 위해 설계</strong></li>
<li>최종적으로 <strong>맨 끝, 중간</strong> 이 2개 각각에서 점수 받음<ul>
<li>gradient 계산해서 <strong>backprop하여 gradient 전파</strong> (당시 심층 네트워크 수렴시키기 위한 trick)</li>
<li>추가적인 보조 분류기 출력 (gradient)를 앞 계층에 넣고, 중간 계층에도 이게 도움되며, 이것들의 일부에 기반해서 분류할 수 있어야 됨</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="6-residual-networks">6. Residual Networks</h3>
<p>📍 batch norm 발견이후/지름길/VGG(Stage) + GoogLeNet(Stem, Inception Module, Global Average pooling) 사용
<strong>1) 모델 생성 배경</strong></p>
<ul>
<li><p><strong>문제점</strong></p>
<ul>
<li>Batch Norm발견 후, 기존에는 bigger layer이 더 성능 좋았는데 이제 깊은 모델이 성능 더 안좋아짐 !
  <strong>= layer가 깊어질수록 효율적인 최적화 불가능 !</strong></li>
</ul>
</li>
<li><p><strong>문제에 대한 이유 예상</strong></p>
<ul>
<li>깊은 모델이 <strong>overfitting</strong> 된 거다.</li>
</ul>
</li>
<li><p><strong>기본 가정</strong></p>
<ul>
<li><strong>deeper model은 shallower model을 모방할 수 있다</strong>
  ex. 56 layer가 20 layer를 모방한다(20 layer의 모든 layer를 56 layer에 copy한다고 생각)
→ 따라서 deeper model은 최소한 shallow model보다 더 성능이 좋다</li>
<li>⇒ 발생하는 문제점이 기본 가정에서 벗어남* </li>
</ul>
</li>
<li><p><strong>해결책</strong></p>
<ul>
<li>layer가 깊은 경우, identity function을 더 쉽게 학습할 수 있도록 network 변경해야됨</li>
<li>그렇게 해서 나오게 된게 Residual Network</li>
</ul>
</li>
</ul>
<p><strong>결론) layer가 깊어질수록 효율적인 최적화 불가능 → layer가 깊을때 identity function을 더 쉽게 학습하도록</strong> </p>
<p><strong>2) Shortcut</strong> </p>
<ul>
<li><p><strong>개념</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/94257cb3-3ace-48af-899b-5281bc40b6e7/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **지름길** 생성</code></pre><ul>
<li><p><strong>장점</strong></p>
<ul>
<li><p><strong>identity function을 매우 쉽게 배울 수 있음</strong></p>
<ul>
<li>지름길 사이의 block들을 가중치=0으로 block identity 계산 가능
  <strong>= deep network가 emulate(모방)하기 쉽게 만듦</strong></li>
</ul>
</li>
<li><p><strong>gradient 전파를 개선하는데 도움</strong></p>
<ul>
<li>ex. 역전파의 +일때, 기울기를 입력에 모두 복사. 이 residual block을 통해 역전파시 지름길로 복사해줄 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>3) 모델 구조</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><p>VGG(단순한 설계 원칙)와 GoogleNet(수학적 계산)의 가장 좋은 부분에서 영감 받음</p>
</li>
<li><p>많은 <strong>residual block의 stack</strong>임</p>
</li>
<li><p><em>a. VGG에서 따온 것*</em></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/c8f5f32b-73c9-4011-a4b4-c40fe624b1f0/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>  - **각 residual block은 2개의 3x3 conv 있음**
  - **Stage 구조**
    - 각 stage의 첫번째 block은 stride 2 conv로 해상도 반으로 줄임
    - 채널 2배로 늘림

**b. GoogleNet에서 따온 것**

  - **Stem 구조**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/ef33eb8a-3ec5-4fed-a362-826f16fcf116/image.png)


    - 처음 input을 **down sampling**함

  - **Global Average Pooling**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/fa2d3a0b-77aa-4469-8fde-ed71cfe3ee42/image.png)


    - 그대로 fully connected layer로 안넘김
    - **파라미터 줄이기 위함**

**c. 사용자가 정해야할 것**

  - **초기 네트워크 너비** ex. C=64
  - **stage당 block 수** ex. 3 residual blocks per stage</code></pre><p><strong>4) 모델 예시</strong></p>
<p><strong>a. ResNet-18</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6c833dbf-26dc-4149-8a47-416366b8380c/image.png" alt=""></p>
<p><strong>b. ResNet-34</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/82f74a5c-9560-42d9-b22f-7d897d25a892/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li>매우 낮은 error 달성</li>
</ul>
</li>
<li><p><strong>VGG-16과 비교</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/d967cd30-93da-4a63-ac87-519369165bb3/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 둘다 resnet이 더 좋음
- GFLOP: ResNet은 앞에 downsampling하고 시작해서 차이 많이 남</code></pre><p><strong>5) Bottleneck Block (GoogleNet의 Inception Module)</strong></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li>더 깊어짐에 따라 Block design수정</li>
</ul>
</li>
<li><p><strong>Basic Block</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/9ff15cbf-1a0a-41ff-9e8e-c445a2d4b504/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 각 conv layer에서만 계산 됨</code></pre><ul>
<li><p><strong>Bottleneck Block</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/79943396-a108-47be-82ff-13422d030747/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 4배 많은 channel의 입력 수락

**⇒ 결론) 계산 비용 증가시키지 않으면서, 더 깊은 네트워크 구축 가능**</code></pre><p><strong>6) 최종 전체 모델 구조</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/7cca7018-7edd-40ef-a7ef-20a5a493ecc8/image.png" alt=""></p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><strong>깊게 쌓을수록, 더 error 줄어듦 !!</strong></li>
</ul>
</li>
<li><p><strong>결과</strong></p>
<ul>
<li><p><strong>다 이겼음</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/3cc3a8a4-073f-4db4-a406-b651751d881f/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="7-improving-residual-networks-block-design">7. Improving Residual Networks: Block Design</h3>
<p>📍 Conv 전에 Batch norm과 Relu넣기</p>
<ul>
<li><strong>개념</strong><ul>
<li><strong>Conv 전에 Batch norm과 Relu를 넣어서 성능 개선가능</strong></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/24477793-5697-4488-9cc6-a8a1c35a33c3/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="8-compare-complexity">8. Compare Complexity</h3>
<ul>
<li><strong>전체 비교</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/3ff6424a-6abc-4845-8ad8-99469dfcb733/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><p><strong>size of dot</strong>: 학습 파라미터 수</p>
</li>
<li><p><strong>G-Ops(Operations)</strong>: 해당 아키텍처의 여유경로 계산하는데 걸리는 FLOP수</p>
</li>
<li><p><strong>Inception-v4:</strong> Resnet + Inception</p>
</li>
<li><p><strong>VGG</strong>: 가장 높은 메모리, 가장 많은 연산량 (매우 비효율)</p>
</li>
<li><p><strong>GoogLeNet</strong>: 매우 효율적 연산량, 그치만 성능은 그닥..</p>
</li>
<li><p><strong>AlexNet</strong>: 매우 적은 연산량, 그치만 엄청 많은 파라미터 수</p>
</li>
<li><p><strong>ResNet</strong>: 심플 디자인, 더 나은 효율성, 높은 accuracy (더 깊게 설계함에 따라)</p>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="9-model-ensembles">9. Model Ensembles</h3>
<ul>
<li>2016 우승자: 좋은 모델들끼리 앙상블함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/63b1507e-317d-4001-99b3-2c19406403ce/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/3a92ee9f-ab57-451c-911c-aa91fe8175e3/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="10-resnext">10. ResNeXt</h3>
<p>📍 ResNet 개선 버전 - Group 추가</p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><p>하나의 <strong>bottleneck</strong>이 좋으면, 이를 <strong>병렬적으로 구성</strong>하면 더 좋지 않겠는가!</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/858ea55a-7346-4aca-9983-64c94760ed4d/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>계산 결과</strong></p>
<ul>
<li><p><strong>Total FLOPs: (8Cc+9c^2)HWG</strong></p>
</li>
<li><p>이걸로 패턴 도출 가능</p>
<ul>
<li><p>C=64,G=4,c=24 ; C=64,G=32,c=4 일때 위와 같은 결과 도출 가능</p>
</li>
<li><p><em>⇒ 결론) Group 으로 병렬적으로 할때 더 좋은 성능 보임*</em></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>1) <strong>Grouped Convolution</strong></p>
<ul>
<li><p><strong>구조</strong></p>
<ul>
<li><p><strong>group=1일때</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/bb3582dc-b145-45a2-9299-193735b968b5/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- **group=2일때**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/156e1bcb-6ecc-462a-89fe-7accbe87445e/image.png)


- **group=G일때**

    ![](https://velog.velcdn.com/images/ha_yoonji99/post/cd92ebfa-e6c0-4fd4-a96e-0ff4f353f99d/image.png)</code></pre><p><strong>2) ResNeXt에 Group 추가</strong></p>
<ul>
<li><p><strong>구조</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/a3e9918e-f9d1-43db-9b85-3972cde691d6/image.png" alt=""></p>
</li>
</ul>
<p><strong>3) Group별 성능 결과</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/92c0591c-747a-4eec-830e-e74a3ab4f1bb/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li><strong>Group을 추가함에 따라 성능 더 좋아짐!</strong></li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="11-senet">11. SENet</h3>
<p>(Squeeze and Excite)</p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/fb882772-3ee1-486e-bc01-5c2fa1226338/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>Residual block 사이에 <strong>Global pooling, FC, Sigmoid</strong> 넣어서 <strong>Global context</strong> 만듦</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/accc4eaf-1048-4616-913f-c23d3f4ad9ee/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Michigan DL/cs231n] 7강: Convolutional Neural Network]]></title>
            <link>https://velog.io/@ha_yoonji99/Michigan-Univ-DL-7%EA%B0%95-Convolutional-Neural-Network</link>
            <guid>https://velog.io/@ha_yoonji99/Michigan-Univ-DL-7%EA%B0%95-Convolutional-Neural-Network</guid>
            <pubDate>Thu, 10 Aug 2023 03:42:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 본 내용은 Michigan University의 &#39;Deep Learning for Computer Vision&#39; 강의를 듣고 개인적으로 필기한 내용입니다. 내용에 오류나 피드백이 있으면 말씀해주시면 감사히 반영하겠습니다. 
(Stanford의 cs231n과 내용이 거의 유사하니 참고하시면 도움 되실 것 같습니다)📌</p>
</blockquote>
<p><br/><br/></p>
<hr>
<h3 id="0-lasttime-back-prop">0. LastTime: Back prop</h3>
<ul>
<li>기존 문제점) 일반 선형분류 or fully connected network는 입력이미지의 2D공간 구조 존중X<ul>
<li>무조건 1D로 바꿨어야됨</li>
</ul>
</li>
<li>해결책) 이미지, 공간구조 다룰줄 아는 operator 새로 정의하면됨</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="1-구성-요소">1. 구성 요소</h3>
<p><strong>1) Fully Connected network</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/688cb2bd-c827-4a05-b3ad-6f54f5c9bcb4/image.png" alt=""></p>
<p><strong>2) Convolutional Network</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/bc0a0ae2-5c79-49e4-9998-fbd24b649958/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="2-fully-connected-layer">2. Fully Connected Layer</h3>
<ul>
<li>벡터화</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/466f84b3-f32e-465d-bd74-1133655a1041/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="3-convolution-layer">3. Convolution Layer</h3>
<p>📍filter가 weight역할 해줌(input에 대한 영향력 전달)
<strong>1) 구조</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/e242faf9-6bd2-4046-8c1b-8145a8c3b74b/image.png" alt=""></p>
<ul>
<li><p><strong>input volume</strong></p>
<p>  3차원 (3x32x32) (RGB x Height x Width)</p>
</li>
<li><p><strong>filter</strong></p>
<ul>
<li>weight matrix와 동일 역할</li>
<li><strong>filter의 RGB와 input의 RGB맞추는것</strong> 중요!</li>
<li>input image의 모든 공간위치로 슬라아드하여, 또 다른 3차원 계산</li>
<li>입력 tensor의 전체 깊이에 걸쳐 확장됨</li>
</ul>
</li>
</ul>
<p><strong>2) first filter</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/916b9509-389c-4a40-92da-90d492b68336/image.png" alt=""></p>
<ul>
<li><p><strong>filter</strong></p>
<ul>
<li><p>input image의 <strong>내부 어딘가</strong>에 붙임</p>
</li>
<li><p>input tensor의 <strong>일부 공간 위치</strong>에 할당</p>
<p>⇒ input tensor와 filter 사이의 <strong>내적곱</strong> 진행</p>
</li>
</ul>
</li>
<li><p><strong>output</strong></p>
<ul>
<li><strong>1개의 element</strong> (single number)</li>
<li>1개의 filter와 input tensor의 작은 local chunk 계산</li>
<li><strong>input image의 이 위치가 하나의 filter와 얼마나 일치</strong>하는지 효과적으로 알려주는 단일 스칼라숫자 계산</li>
</ul>
</li>
</ul>
<p><strong>3) second filter</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/32f1548d-3cd6-42ab-896d-f967baf11976/image.png" alt=""></p>
<ul>
<li><strong>activation map</strong><ul>
<li><strong>filtering한 결과</strong>를 부르는 다른 말</li>
</ul>
</li>
<li><strong>green filter</strong><ul>
<li>앞과 weight값이 다른 filter</li>
</ul>
</li>
</ul>
<p><strong>4) 여러개의 filter</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/c375d671-b633-4a66-b717-fe91c2665c63/image.png" alt=""></p>
<ul>
<li><strong>여러 filter (6x3x5x5)</strong><ul>
<li>집합 6개의 3차원 필터</li>
<li>6 x 3 x 5 x 5 = <strong>filter수 x input channel수 x (filter크기)</strong></li>
<li><strong>6개의 activation map 나옴</strong></li>
</ul>
</li>
<li><strong>stack activation maps (6개)</strong><ul>
<li>크기는 달라졌지만 <strong>첫 input과 같은 3차원 공간구조</strong> 보존</li>
<li>해당 필터에 대한 전체 입력이미지의 <strong>응집정도</strong> 나타냄</li>
<li>합성곱층의 <strong>출력의 공간구조</strong> 생각 가능</li>
</ul>
</li>
<li><strong>28 x 28 grid</strong><ul>
<li>입력 tensor의 <strong>동일 공간 grid</strong>에 해당 (각 위치에서 합성곱층은 특징벡터 계산)</li>
</ul>
</li>
<li><strong>6-dim bias vector</strong><ul>
<li>원래 <strong>하나의 filter당 1개 bias</strong>있음</li>
<li>총 6차원(vector) bias 있는 것</li>
</ul>
</li>
</ul>
<p><strong>5) 3차원 tensor batch</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/5e50fd69-3221-4fe3-97c1-ded4e29484b7/image.png" alt=""></p>
<p><strong>6) 일반화</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ca392545-ca9f-49f5-a26e-6843ddb17c23/image.png" alt=""></p>
<ul>
<li><strong>input</strong><ul>
<li><strong>N x Cin X H x W</strong> = <em>(개수 x batch의 각 입력image에 있는 채널수 x 각 입력 요소의 공간 크기)</em></li>
</ul>
</li>
<li><strong>output</strong><ul>
<li><strong>N x Cout x H’ x W’</strong> = (개수 x filter개수(Cin과 다를수있음) x input image의 H,W와 다를수O)</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="4-stacking-convolutions">4. Stacking Convolutions</h3>
<p>📍filter(conv)뒤에 활성화함수 넣어서 선형 극복</p>
<ul>
<li><strong>Convolution layer를 stacking가능</strong> (더이상 fully connected layer X)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/9e60b9b9-bbdf-4523-8412-50447bcffe54/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><strong>input</strong><ul>
<li>3차원 tensor batch <strong>N개</strong></li>
</ul>
</li>
<li><strong>W1 : 6x3x5x5</strong><ul>
<li>의미: 6개의 convolution filter</li>
</ul>
</li>
<li><strong>Nx3x32x32</strong><ul>
<li>부르는 이름: 3 layer CNN with input in Red, first hidden layer blue, second hidden layer green</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Q. 2개 convolution layers stack하면 어케됨?</strong></p>
<p>  <strong>A. 또 다른 convolution 얻음</strong> (y=W2W1x도 여전히 linear classifier임)</p>
<ul>
<li><p>각 convolution 작업자체가 linear 연산자이므로, 하나의 convolution을 또 stack하면, 또 다른 합성곱 만들어짐</p>
</li>
<li><p><em>⇒ 극복) 각 선형 연산 사이에 비선형 활성화함수 삽입*</em></p>
</li>
<li><p><em>(fully connected layer같이 3차원 tensor의 각 요소에 대해 작동)*</em></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/6e432496-bea4-4df0-9721-8ee69b943634/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="5-학습가능한-convolutional-filter">5. 학습가능한 convolutional filter</h3>
<p>📍MLP: 모든 이미지 template을 학습함- 1번째에서는 모서리 위주
<strong>1) 기존 linear classifier</strong></p>
<ul>
<li><p><strong>conv filter가 뭘 학습하는가? → one template per class (1차원만 가능해서)</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/60449f39-5a6f-48e9-91bd-011e59d7e632/image.png" alt=""></p>
</li>
</ul>
<p><strong>2) MLP</strong></p>
<ul>
<li><p><strong>conv filter가 뭘 학습하는가? → Bank of whole image templates (다차원도 가능해서)</strong></p>
</li>
<li><p><strong>fully connected:</strong> 입력 이미지의 전체 크기에 걸쳐 확장됨
  = fully connected network와 1번째 layer는 각각 입력 이미지와 동일 크기를 갖는 template bank 가짐</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/ad2f33df-c1de-4823-bed9-40a007c387c8/image.png" alt=""></p>
</li>
</ul>
<p><strong>3) First layer conv filters</strong></p>
<ul>
<li><strong>conv filter가 뭘 학습하는가? → local image templates (모서리, 반대 색 학습)</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/28e82821-a11d-4ade-b0c6-47c790cf4935/image.png" alt=""></p>
<ul>
<li>ex. green blob next to red blob<ul>
<li>image의 반대 색상을 찾고있다는 것</li>
<li>1번째 convolution 연산후 2번째 feature이 뭔지에 대한 해석은 해당 3D 출력 tensor에서 각 활성화 map이 각 위치의 정도 제공</li>
<li>해당 chunk가 1번째 layer에서 학습된 각 template과 얼마나 일치하는지 (ex. 합성곱 네트워크의 1번째 층에서 학습된 이러한 필터들과 유사효과)</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="6-padding">6. Padding</h3>
<p>📍기존: W-K+1  → 패딩후: W-K+1+2P</p>
<ul>
<li><strong>깊이, 채널 고려X</strong></li>
</ul>
<p><strong>1) 기본</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/2d3ba70c-937b-4f1d-8e2d-41b1c088acda/image.png" alt=""></p>
<ul>
<li><p><strong>출력크기 (일반화)</strong></p>
<p>  <strong>: W-K+1</strong> </p>
</li>
<li><p><strong>문제점</strong></p>
<p>  : feature map이 각 layer마다 줄어듦(공간 차원이 줄어듦)</p>
</li>
</ul>
<p><strong>2) 해결책: 패딩</strong></p>
<ul>
<li><p><strong>zero-padding</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/fcf8745b-018b-4ac6-a8e2-d027ccdc5b8d/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><strong>패딩 추가 후</strong></p>
</li>
<li><p><strong>output 일반화 식</strong></p>
<p>  : <strong>W-K+1+2P</strong></p>
</li>
<li><p><strong>Same padding</strong></p>
<ul>
<li>입출력이 동일 공간 크기 가져서 → 공간 크기 추론이 쉬워짐</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="7-receptive-fields">7. Receptive fields</h3>
<p><strong>1) 1개의 conv layer 적용</strong></p>
<pre><code>                      (1)                               (2)</code></pre><p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/05a3dabc-a5b9-497b-87fa-b5cae100425f/image.png" alt=""></p>
<ul>
<li><strong>해석</strong><ul>
<li>output image의 각각의 공간 위치는 input image의 <strong>local region</strong>에만 의존</li>
<li>ex. 2는 1의 영역에만 의존<ul>
<li>1의 영역: receptive field of the value of output tensor</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>2) 여러개의 conv layer를 stack</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/69559c73-3869-4ef5-b4d7-ae115ee3b0e2/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li><strong>녹색 영역</strong>은 전이적으로 맨 왼쪽 input tensor의 주황부분의 공간에 따라 달라짐</li>
</ul>
</li>
<li><p><strong>2가지 해석</strong></p>
<ul>
<li><strong>receptive field in the input:</strong> 여러개의 합성곱층 거친 후, <strong>해당 뉴런 값에 영향 미칠수있는 input image의 공간 크기</strong></li>
<li><strong>receptive field in the previous layer:</strong> <strong>이전층</strong>의 영향</li>
</ul>
</li>
<li><p><strong>문제점</strong></p>
<ul>
<li>매우 높은 해상도 이미지로 작업하려면 → conv layer많이 쌓아야됨
  = 매우 큰 receptive field 유지위해 엄청 많은 conv layer 쌓아야됨</li>
</ul>
</li>
<li><p><strong>해결책</strong></p>
<ul>
<li><strong>stride</strong> 써서 <strong>downsampling</strong>하기</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="8-stride-convolution">8. Stride convolution</h3>
<p>📍receptive field 더 빨리 구축 → ((W-K+2P)/S)+1)
<strong>1) Stride</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/0d6fa033-f518-4441-8c84-0b30074f75c3/image.png" alt=""></p>
<ul>
<li><strong>개념</strong><ul>
<li>가능한 모든 위치에 conv filter 배치하는 대신, <strong>가능한 N의 위치마</strong>다 배치</li>
<li>ex. stride=2 → output=3x3</li>
</ul>
</li>
<li><strong>output</strong><ul>
<li><strong>downsample</strong>됨</li>
<li><strong>receptive field를 더 빨리 구축가능</strong><ul>
<li>모든 layer에서 receptive field가 2배가 되기 때문</li>
</ul>
</li>
<li><strong>((W-K+2P)/S)+1</strong></li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="9-recap-convolution-example">9. Recap: Convolution Example</h3>
<p>📍걍 일반화 식들 정리
<strong>1) output volume size?</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/bc4bb5db-458b-42f6-b609-3006e8418d32/image.png" alt=""></p>
<ul>
<li><strong>주의점</strong><ul>
<li><strong>output은 filter 개수와 동일해야됨 !!!!</strong></li>
</ul>
</li>
</ul>
<p><strong>2) Number of learnable parameters?</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/ff98072b-386c-4e29-943a-76c8674d9ae6/image.png" alt=""></p>
<ul>
<li><strong>일반화 식</strong><ul>
<li><strong>filter 개수 * (channel수<em>filter크기(k</em>k)+1(bias))</strong></li>
</ul>
</li>
</ul>
<p><strong>3) Number of multiply-add operations?</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/1a3e819b-47ad-4610-822f-c7010f487174/image.png" alt=""></p>
<ul>
<li><strong>일반화 식</strong><ul>
<li>output volume size * 1filter</li>
</ul>
</li>
</ul>
<p><strong>4) example: 1x1 convolution</strong>
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/053909ff-b5da-41a7-ae4a-1f6d022aa95e/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="10-convolution-summary">10. Convolution Summary</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/dfb403bd-7da9-444e-84b0-ffbacec1222f/image.png" alt=""></p>
<ul>
<li><strong>비교</strong></li>
</ul>
<table>
<thead>
<tr>
<th>fully connected layer</th>
<th>1x1 conv layer</th>
</tr>
</thead>
<tbody><tr>
<td>공간구조 파괴 : 전체 tensor 하나로 평면화 → 벡터 출력</td>
<td>공간구조 유지</td>
</tr>
<tr>
<td>: 신경망 내부의 adapter 사용</td>
<td></td>
</tr>
</tbody></table>
<p><br/><br/></p>
<hr>
<h3 id="11-other-types-of-convolution">11. Other types of convolution</h3>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/bae0da3d-a9a0-4f05-b265-e2225936ebdc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/8a1a3a6a-7dc5-41f9-bc4b-f13af2421e3a/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="12-pooling-layers">12. Pooling Layers</h3>
<p>📍pooling더 쓰는 이유: 학습파라미터X, 값이 안변함</p>
<ul>
<li><p><strong>개념</strong></p>
<ul>
<li><p><strong>학습 매개변수(파라미터) 없음</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/3c350d69-6ca5-4a5e-b34b-640a2bc9bde6/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>파라미터</strong></p>
<ul>
<li>kernel size</li>
<li>stride</li>
<li>pooling function</li>
</ul>
</li>
<li><p><strong>Max pooling</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/074a899f-4e49-4bf5-9d25-0c12d6a69d75/image.png" alt=""></p>
</li>
</ul>
<pre><code>**a. Max pooling with 2x2**
(= kernel size (2,2) &amp; stride=2)
→ kernel size = stride면 중첩되는 영역X
**b. pooling이 stride보다 더 많이 쓰이는 이유**

- **이유1)** max pooling같은 경우, 변환에 일정량의 불변성 있음**(해당 구역에서 값이 안변함)**
- **이유2) learnable parameter없음**</code></pre><ul>
<li><p><strong>pooling summary</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/c446e752-83c5-414c-8f99-c9f4c9a5792b/image.png" alt=""></p>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="13-앞서-배운것들-결합한-convolutional-networks">13. 앞서 배운것들 결합한 Convolutional Networks</h3>
<p><strong>1) 기본 CNN 구조</strong></p>
<ul>
<li>앞서 배운것들 연결하는 방법 많음<ul>
<li>하이퍼파라미터가 있어서</li>
</ul>
</li>
</ul>
<p><strong>2) 예시: LeNet-5</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/04c584ed-21b0-43b5-84a1-26904e712911/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/132e413c-d514-4118-8a28-3e04eae953b9/image.png" alt=""></p>
<ul>
<li><p><strong>해석</strong></p>
<ul>
<li>conv후에 relu넣는게 일반적</li>
</ul>
</li>
<li><p><strong>Q. maxpool로 비선형하게 만들수있는데 왜 relu함?</strong></p>
<p>  A. 걍 relu넣는게 일반적 (더 많은 규칙성 제공)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/aae92506-0f31-4068-8199-3ce6138685a6/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="14-fully-connected-network에서-batch-normalization">14. (Fully connected Network에서) Batch Normalization</h3>
<p>📍선형적으로 할수있음
<strong>1) 개념</strong></p>
<ul>
<li>네트워크 내부에 <strong>일종의 layer</strong>추가하여 <strong>deep network를 train</strong>할수 있도록</li>
<li>(평균=0, 단위분산분포 있도록) <strong>이전 layer로부터 나온 결과</strong>를 어떤 방식으로든 <strong>정규화하기</strong></li>
</ul>
<p><strong>2) 왜 정규화해야됨?</strong></p>
<ul>
<li><p><strong>internal covariate shift (ICS) ↓ → 학습 과정 안정화, 최적화 ↑</strong></p>
<ul>
<li><p><strong>ICS</strong>: 학습과정에서 각 층의 입력 분포가 변하는 것 의미</p>
</li>
<li><p>일반적으로 신경망에서 학습이 진행될수록 가중치, 편향이 업데이트 되고, 이는 <strong>각 층의 입력 데이터에 영향줌</strong>
  → 이로 인해 이전 층에서 학습한 표현들이 변경되어 다음 층에 영향 미치게 됨</p>
</li>
<li><p><strong>ICS는 학습의 안정성, 속도 ↓시킴</strong></p>
</li>
</ul>
</li>
</ul>
<p><strong>3) Batch Norm 식</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/db2a259e-5ec5-4136-91b7-270763225b2c/image.png" alt=""></p>
<ul>
<li><strong>backprop에 사용이 어케되냐</strong><ul>
<li>미분 가능 함수여서 gradient를 전달해줄수O</li>
</ul>
</li>
</ul>
<p><strong>4) 특징</strong></p>
<ul>
<li>(ICS제거 위해) 각 layer의 <strong>입력 feature 분포를 re-centering, re-scaling</strong></li>
<li>각 layer마다 <strong>input의 분포가 달라지는 것 방지</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/8b54b51e-a92d-4f0c-b7b8-a26fc4d1447d/image.png" alt=""></p>
<ul>
<li><p><strong>batch ↕</strong></p>
<ul>
<li>각 벡터의 평균값</li>
</ul>
</li>
<li><p><strong>첫번째 식</strong></p>
<ul>
<li>채널별 평균값</li>
</ul>
</li>
<li><p><strong>두번재 식</strong></p>
<ul>
<li>채널별 분산</li>
</ul>
</li>
<li><p><strong>세번째 식</strong></p>
<ul>
<li>1,2번째 식 가져와서 정규화</li>
<li>e : 0으로 나누지 않기 위함(작은 상수)</li>
<li><strong>zero centered</strong> 됨</li>
</ul>
</li>
<li><p><strong>문제점 <em>(학습 파라미터를 넣는 궁극적 이유)</em></strong></p>
<ul>
<li><strong>Q. zero mean일때, 제약이 많이 걸리지 않을까?</strong></li>
</ul>
</li>
<li><p><strong>해결책</strong></p>
<ul>
<li><p>기본 정규화 후 <strong>추가 작업(학습가능 파라미터 넣기) 필요</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/e48024da-1e21-4e4a-bd24-fa57a0def485/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>⇒ identity function 을 커버해줌</code></pre><p><strong>5) 학습 시 batch normalization</strong> </p>
<ul>
<li><p><strong>최종 batch normalization 식</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/742a9529-fca8-4411-8d2f-ed9c4075a67e/image.png" alt=""></p>
</li>
</ul>
<pre><code>- $\hat{x}_{i,j}$ : 정규화된 input
- $y_{i,j}$ : 벡터의 각 요소에서 보고자하는 평균, 분산이 뭔지 스스로 학습 가능</code></pre><p><strong>6) 검증(test)시 batch normalization</strong></p>
<p><strong>a. 문제점</strong></p>
<ul>
<li><p>다른 input 넣었는데, 넣는 것이 달라도 점수 같아버림</p>
</li>
<li><p>같은 input 넣었는데, output이 달라져버림</p>
</li>
<li><p>ex. 고양이 사진 넣었을때의 점수와, 강아지 사진 넣었을때의 점수가 같아버릴때</p>
</li>
<li><p>ex. 웹서비스에서 동시에 고객이 같은 자료 업로드했는데 output이 다를때</p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/6a6311aa-764c-455f-8db1-9c4e1bfad1fb/image.png" alt=""></p>
</li>
</ul>
<p><strong>b. 해결책</strong></p>
<ul>
<li><p>배치의 요소에 대해 모델이 독립적이여야됨 (= train과 test 둘다에서 성능 좋아야됨)</p>
</li>
<li><p>train 시에는 경험적으로 하지만, <strong>test에서는 그렇지 X (= batch에 기반하여 계산X)</strong></p>
</li>
<li><p><strong>방법</strong></p>
<ul>
<li><strong>train</strong><ul>
<li>모든 새로운 벡터와 시그마 벡터의 모든 평균 중 일부 실행 중인 지수 평균 추적</li>
</ul>
</li>
<li><strong>test</strong><ul>
<li>batch 요소 사용하는 대신, $<strong>M_j,$ $\sigma$ 같은 고정 scalar</strong> 될것 (상수)</li>
<li>test 시간 배치의 요소간에 <strong>독립성</strong> 회복 가능</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>수식</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/a197ea06-eb55-4346-a45c-48d062c74515/image.png" alt=""></p>
</li>
</ul>
<pre><code>- **해석**
    - $M_j, \sigma$가 상수면, $y_{i,j}$가 **linear 연산**될 것
        - test에서 batch정규화가 독립적
        - test에 이전 선형 연산자가 융합할수있기에 **test시간 오버헤드=0**이 됨
        - ex. CNN에서 배치정규화 뒤에 conv 있으면, **2개의 선형연산을 1개로 융합가능**
        - $y_{i,j}$: (배율, 이동) scaling단계에서 학습된 가중치 $\gamma$ 곱하고 학습된 값으로 $\beta_j$만큼 이동</code></pre><p><br/><br/></p>
<hr>
<h3 id="15-convolutional-network에서-batch-normalization">15. (Convolutional Network에서) Batch Normalization</h3>
<p>📍장점(train쉽게, LR높게,regularization, test 추가비용x) 및 단점 존재</p>
<p>1) <strong>비교</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/c073ca56-a352-4459-af23-6411ef1d7399/image.png" alt=""></p>
<ul>
<li><strong>fully connected</strong><ul>
<li>앞서 말한것</li>
</ul>
</li>
<li><strong>convolutional</strong><ul>
<li>batch 차원에 대한 평균화 + spatial(공간차원)의 input에 대한 평균화</li>
</ul>
</li>
</ul>
<p><strong>2) 위치</strong></p>
<ul>
<li><p><strong>FC뒤 or 활성화함수 앞에 위치함</strong></p>
<p>  <img src="https://velog.velcdn.com/images/ha_yoonji99/post/cab2c865-f654-43b9-ac9f-db490418a927/image.png" alt=""></p>
</li>
</ul>
<p><strong>3) 특징</strong></p>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/c620c5d0-f021-479e-abda-52a0c55873a3/image.png" alt=""></p>
<ul>
<li><strong>장점</strong><ul>
<li>심층 신경망 <strong>train을 더 쉽게</strong> 만듦</li>
<li><strong>더 높은 LR을 가능하게 하고, 더 빨리 수렴</strong> 가능</li>
<li>네트워크 <strong>초기화에 더 견고</strong>해짐</li>
<li>학습 중 <strong>regularization</strong>과 같은 역할</li>
<li><strong>test시 추가 비용 없음</strong>: conv와 병합 가능</li>
</ul>
</li>
<li><strong>단점</strong><ul>
<li>이론적 해석 부족 : 최적화에 도움 되는 이유에 대한 정확한 이해X</li>
<li>train, test에서 다르게 동작함 → 흔한 <strong>버그의 원인</strong>이 됨</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="16-layer-normalization">16. Layer Normalization</h3>
<p>📍배치차원평균X, D 평균O</p>
<ul>
<li><strong>Batch norm의 train- test에서 다른 작업하는 것에 대한 해결책</strong></li>
<li>기존에 대한 변형 → transformer, RNN에서 주로 사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/b7a31680-75f4-41e0-81c9-d6887c9b3d6e/image.png" alt=""></p>
<p><strong>1) 특징</strong></p>
<ul>
<li><strong>기존과 공통점</strong><ul>
<li>$M$, $\sigma$ 구하고 정규화 과정은 똑같음</li>
</ul>
</li>
<li><strong>차이점</strong><ul>
<li>배치차원에 대한 평균 대신, <strong>기능 차원(D)에 대한 평균</strong>계산 (<strong>↔</strong>)</li>
<li>train 요소에 의존 안하므로, train과 test에 같은 작업 가능</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<hr>
<h3 id="17-instance-normalization">17. Instance Normalization</h3>
<p>📍배치차원평균X, D 평균X, 공간차원 평균O</p>
<ul>
<li><strong>(CNN에서) 공간 차원에 대해서만 평균 구함</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/ha_yoonji99/post/83d6bd89-21e1-4e96-a829-bf00ccefb2f8/image.png" alt=""></p>
<p><br/><br/></p>
<hr>
<h3 id="18-최종-비교">18. 최종 비교</h3>
<p>📍CNN에서 Batch norm, Layer norm, Instance norm, Group norm
<img src="https://velog.velcdn.com/images/ha_yoonji99/post/7c2a8ab4-c6be-44d2-b6a7-67fbb098d721/image.png" alt="">
(예를 들어 input이 이미지set (2x3x64x64)가 input이라고 했을 때..)</p>
<ul>
<li><strong>Batch norm</strong>: 이미지set전부와 각각의 채널별로 정규화한다. (2개의 이미지와 R, 2개의 이미지와 G, 2개의 이미지와 B)(2x1x64x64)</li>
<li><strong>Layer norm</strong>: 하나의 이미지에 대해서 정규화 한다. (1x3x64x64)</li>
<li><strong>Instance norm</strong>: 하나의 이미지에 대해 각각의 채널별로 정규화 한다. (채널 R에 대한 1개의 이미지)(1x1x64x64)</li>
<li><strong>Group norm</strong>: 하나의 이미지에 대해 여러 채널에 대해 정규화 한다. (채널 R과 G에 대한 1개의 이미지)(1x2x64x64)</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>