<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>안녕, 세상!</title>
    <link>https://luminitworld.tistory.com/</link>
    <description>IT공부를 정리하는 IT일기장입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 07:15:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev_Lumin</managingEditor>
    <image>
      <title>안녕, 세상!</title>
      <url>https://tistory1.daumcdn.net/tistory/3775744/attach/30efe8028f1f48b0948584f367afad81</url>
      <link>https://luminitworld.tistory.com</link>
    </image>
    <item>
      <title>RSANet: Towards Real-Time Object Detection with Residual Semantic-Guided Attention Feature Pyramid Network</title>
      <link>https://luminitworld.tistory.com/120</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Abstract&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규모가 큰 컴퓨팅 overhead는 object detection을 위한 mobile devices에서의 convolutional neural networks의 inference를 제한시킴&lt;/li&gt;
&lt;li&gt;이를 해결하기 위해서 해당 논문은 RSANet이라고 부르는 경량화 convolutional neural network를 제안함&lt;/li&gt;
&lt;li&gt;크게 두 가지 파트로 나뉨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(a) &lt;b&gt;Lightweight Convolutional Network (LCNet)&lt;/b&gt; as backbone&lt;/li&gt;
&lt;li&gt;(b) &lt;b&gt;Residual Semantic-gudied Attention Feature Pyramid Network (RSAFPN)&lt;/b&gt; as detection head&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LCNet
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Feature maps의 수를 변경하기 위해 point-wise convolution을 사용하는 것을 선호하는 최신 진보된 경령화 기법과 다르게 설계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Constant Channel Module (CCM)&lt;/b&gt;을 설계하여 Memory Access Cost를 줄이고,&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Down Sampling Module*&lt;/i&gt;을 설계하여 computational cost를 줄임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RSAPFN
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Detection 성능을 효과적으로 개선하기 위해서,&lt;/li&gt;
&lt;li&gt;&lt;i&gt;LCNet*&lt;/i&gt;으로 부터의 multi-scale features를 fuse하는 &lt;b&gt;Residual Semantic-guided Attention Mechanism (RSAM)&lt;/b&gt;을 이용함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실험 결과는
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PASCAL VOC 20007 dataset 기반으로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RSANet은 오직 3.24M model size가 요구되고&lt;br /&gt;416x416 input image에 대하여 3.54B FLOPs가 필요함&lt;/li&gt;
&lt;li&gt;YOLO Nano와 비교해서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 적은 computation으로 6.7% 정확도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MS COCO dataset 기반으로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RSANet은 4.35M model size가 요구되고&lt;br /&gt;320x320 input image에 대해서 2.34B FLOPs가 필요함&lt;/li&gt;
&lt;li&gt;Pelee와 비교해서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1.3%의 정확도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델은 Speed와 accuracy trade-off관점에서 유망한 결과를 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Introduction&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CNN은 computer vision에서 지배적이고,&lt;br /&gt;높은 정확도를 얻기 위해 더 깊어지고 넓어지는것이 일반적임&lt;/li&gt;
&lt;li&gt;이러한 이점으로 최근에 deep CNNs를 사용한 object detection task에서 눈에 띄는 성과와 개선이 이뤄짐&lt;/li&gt;
&lt;li&gt;특히 region-based 접근이 detection accuracy를 크게 향상 시킴&lt;/li&gt;
&lt;li&gt;하지만 extra region proposal extraction step 때문에, two-stage 방식은 real-time application 시나리오에서 computational 비용이 큼&lt;/li&gt;
&lt;li&gt;이를 대안으로 one-stage pipline을 다룰려고 시도함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Class probabilitie와 bounding box offsets가 forward convolutional network를 이용하여 full image로부터 feature maps에서 바로 예측됨&lt;/li&gt;
&lt;li&gt;이로 인해 one-stage는 extra region proposal extraction step이 필요 없음&lt;/li&gt;
&lt;li&gt;Pipe-line이 하나이기에 time-saving 하고 더 real-time applcation에서 수용 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 이 방식들은 오직 pipeline의 단순화에만 집중을 하고 network 그 자체로서의 complexity는 무시함&lt;/li&gt;
&lt;li&gt;이러한 문제들을 해결하, real-time 시나리오를 채택하기 위해서,&lt;br /&gt;효율적인 CNN models를 memory와 computational budgets의 엄격한 조건에서 실행될 수 있도록 한 연구들이 많아짐&lt;/li&gt;
&lt;li&gt;Network inference 속도를 빠르게 하는 요인들은 다음과 같음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Model size&lt;/li&gt;
&lt;li&gt;Computational cost&lt;/li&gt;
&lt;li&gt;MAC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이를 해결하기 위한 연구들에도 한계가 존재함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그들은 오직 model size와 computational cost만 고려했지,&lt;br /&gt;inference 시간에 대한 MAC 효과를 무시함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그리하여 본 논문은 제한된 computational cost 조건에서 MAC를 최소화시키기 위한 &lt;b&gt;CCM&lt;/b&gt;을 사용함&lt;/li&gt;
&lt;li&gt;또한 &lt;b&gt;RSAM&lt;/b&gt;을 채택하여 더 강력한 feature representation을 얻고자 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 구체적으로 말하자면,&lt;/li&gt;
&lt;li&gt;&lt;i&gt;RSANet*&lt;/i&gt;이라는 새로운 real-time network를 설계하고,&lt;br /&gt;정확도와 효율성의 trade-off를 달성하기 위한 효율적인 &lt;b&gt;RSAFPN&lt;/b&gt;을 채택함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbJd5q/btrxoXKesxE/jx4IE5loJMpX9JQdLPqK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbJd5q/btrxoXKesxE/jx4IE5loJMpX9JQdLPqK00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbJd5q/btrxoXKesxE/jx4IE5loJMpX9JQdLPqK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbJd5q%2FbtrxoXKesxE%2Fjx4IE5loJMpX9JQdLPqK00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;513&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig 1에서 볼 수 있듯이,&lt;br /&gt;RSANet은 크게 두가지 파트로 나뉨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(a) LCNet as backbone&lt;/li&gt;
&lt;li&gt;(b) RSAFPN as detection head&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ShuffleNetv2로 부터 영감을 받아서, backbone network는 주로 &lt;b&gt;CCM&lt;/b&gt;으로 구성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 Block 모두 feature map channels수가 일정함&lt;/li&gt;
&lt;li&gt;&amp;rarr; 이것은 MAC를 최소화시키는것을 목적으로 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stride 2를 가진 표준적인 convolution에 반하여,&lt;br /&gt;논문의 DSM은 stride 2를 가진 depthwise convolution과 max pooling을 섞어서&lt;br /&gt;computational cost를 아낌&lt;/li&gt;
&lt;li&gt;Low-level features (초반 단계)는 localization에 대한 local detail 정보를 포함하고 있고,&lt;br /&gt;High-level features (후반단계)는 classification을 위한 global semantic information을 가지고 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Semantic information
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Not only what objects are present in an image but, perhaps even more importantly, the relationship between those obeject&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대부분의 object detection 연구는 &lt;b&gt;FPN (Feature Pyramid Network) framework&lt;/b&gt;을 채택하여,&lt;br /&gt;addtion 또는 concatenation operation을 사용하여 high-level features와 low-level features를 결합시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2mJit/btrxmzXagDp/hcwjZ5SFCQJgp5Q2mTOiLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2mJit/btrxmzXagDp/hcwjZ5SFCQJgp5Q2mTOiLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2mJit/btrxmzXagDp/hcwjZ5SFCQJgp5Q2mTOiLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2mJit%2FbtrxmzXagDp%2FhcwjZ5SFCQJgp5Q2mTOiLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;716&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위의 그림은 Feature Pyramid Network를 나타내는 그림)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 방식으로라면, 모든 levels에서 풍부한 semantics를 가진 feature pyramid는 하나의 input image scale로부터 구축됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RSAFPN&lt;/b&gt; framework에서 &lt;b&gt;FPN&lt;/b&gt;기반 &lt;b&gt;RSAM&lt;/b&gt;을 소개하고,&lt;br /&gt;이는 high-level features로부터 강력한 semantic 정보가 정확한 classification을 위해 low-level features를 guide(안내)하는 데 사용됨&lt;/li&gt;
&lt;li&gt;반면에, &lt;b&gt;RSAFPN&lt;/b&gt;은 적은 computational overhead 환경에서 context information을 잡아내기 위해서 depthwise convolution을 사용하는 &lt;b&gt;LCCU&lt;/b&gt; 유닛을 이용함&lt;/li&gt;
&lt;li&gt;요약하자면 contribution은 다음과 같음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 &lt;b&gt;CCM&lt;/b&gt;을 제안하여 MAC를 최소화시킴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CCM&lt;/b&gt;과 &lt;b&gt;DSM&lt;/b&gt;기반으로, features을 추출하는 &lt;b&gt;LCNet&lt;/b&gt;이라는 이름의 backbone network를 앞에 배치시킴 ( put forward)&lt;/li&gt;
&lt;li&gt;Computational cost를 줄이기 위해서 &lt;b&gt;LCCU&lt;/b&gt;를 사용한 &lt;b&gt;RSAFPN&lt;/b&gt; head를 설계함&lt;br /&gt;또한 적은 추가적 computational budgets으로 detection 정확도 향상을 달성하기 위해서,&lt;/li&gt;
&lt;li&gt;&lt;i&gt;RSAFPN*&lt;/i&gt;으로 embedded 되는 &lt;b&gt;RSAM&lt;/b&gt;을 제안함&lt;br /&gt;그로인해 &lt;b&gt;LCNet&lt;/b&gt;과 &lt;b&gt;RSAPFN&lt;/b&gt;으로 구성된 전체 네트워크는 경량화됨&lt;/li&gt;
&lt;li&gt;실험 결과는 &lt;b&gt;RSANet&lt;/b&gt;이 speed와 accuracy 사이의 available trade-off 관점의 object detection에서 유망하게 성능을 낸다는 것을 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Related work&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Real-time object detection&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최근에 object detection piplines 기반 딥러닝은 크게 두 개의 categories로 나뉨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(1) two-stage detectors
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g. R-CNN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(2) One-stage detectors
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g. YOLO&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Two-stage detectors가 주로 public benchmarks에서 더 나은 성능을 보이는 반면,&lt;br /&gt;One-stage detectors는 제안된 computational resources에서 object를 detect 하는데 더 적합함&lt;/li&gt;
&lt;li&gt;Depth separable convolution
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Standard convolution과 다름
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Standard convolution에서 convolution kernel가 모든 input channels를 필터링함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;먼저 서로 다른 input channels를 개별적으로 convolve 하는 depthwise convolution을 진행 후,&lt;br /&gt;depth seperable convolution의 outputs를 linearly 하게 합치는 pointwise convolution을 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최근 연구들은 depth seperable convolution이 standard convolution과 비교해서 비슷하거나 심지어 더 좋은 결과들을 성취할 수 있으며,&lt;br /&gt;동시에 computational resources를 매우 절약해주고 model size도 거의 사용지 않는다고 함&lt;/li&gt;
&lt;li&gt;이러한 depth seperable convolution을 사용한 여러 연구들은 object detection을 위한 경량화에 사용되어서 많은 기여를 했지만,&lt;br /&gt;중요한 요소인 MAC을 무시하고 진행함&lt;/li&gt;
&lt;li&gt;이러한 방식과 다르게 본 논문에서는 inference speed에서의 MAC효과를 고려한 &lt;b&gt;LCNet&lt;/b&gt;이라는 이름을 가진 lightweight backbone을 디자인함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Vision attention&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Speech recogntion의 application에 많은 영감을 받아서, visual attention은 computer vision community에서 많이 쓰임&lt;/li&gt;
&lt;li&gt;Attention mechanism은 성능을 향상하기 위해 feed forward network를 guide 하는 global context로 사용될 수 있음&lt;/li&gt;
&lt;li&gt;최근 몇 년간, large-scale classification tasks에서 CNNs의 성능을 향상하기 위해서 attention processing을 통합하는 몇몇 시도들이 이뤄짐&lt;/li&gt;
&lt;li&gt;대표적으로 Squeeze-and-Excitation module은 channel-wise attention을 compute 하는 global average-pooled features를 사용함&lt;/li&gt;
&lt;li&gt;이러한 models와 다르게, 본 논문에서는 &lt;b&gt;RSAM&lt;/b&gt;을 사용함&lt;/li&gt;
&lt;li&gt;이러한 attention 관련 연구들은 vision attention 영역에서 많은 발전을 이뤘지만, 그들은 reweighting을 위한 각 detection layer에서 오직 attention map만 만들었고, 더 얕은 layer classification로 향하는 더 깊은 layer의 semantic information의 중요성을 무시함 (?)&lt;/li&gt;
&lt;li&gt;해당 연구에서는 &lt;b&gt;RSAFPN&lt;/b&gt;을 구축하는데 필요한 &lt;b&gt;RSAM&lt;/b&gt;에서 &lt;b&gt;FPN&lt;/b&gt;구조까지 소개함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 &lt;b&gt;RSAFPN&lt;/b&gt;은 low level detection performance를 향상시키기 위한 강력한 semantic informationd을 제공하는 high-level features를 encoding 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Method&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연구진들은 accuracy와 computational complexity를 둘 다 중요하게 생각함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 Network architecture&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연구의 주 동기는 accuracy와 efficiency 사이의 가장 좋은 가능한 trade-off을 성취하는 network를 얻는 것임&lt;/li&gt;
&lt;li&gt;크게 두 구조인 &lt;b&gt;LCNet&lt;/b&gt;과 &lt;b&gt;SPAFPN&lt;/b&gt; 가 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LCNet&lt;/b&gt;은 적은 computational overhead조건에서도 strong 구조를 디자인할 수 있도록 하는 &lt;b&gt;CCM&lt;/b&gt; 기반으로 설계됨&lt;/li&gt;
&lt;li&gt;Detection 부분에서는 &lt;b&gt;SAFPN&lt;/b&gt;을 채택함으로써 high-level semantic 정보와 low-level detail 정보를 융합하여 detection performance를 효과적으로 향상시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 LCNet&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LCNet은 VGG와 같은 plain overall 구조를 따름&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybwgq/btrxlq7emxZ/F2XljAzuR37eMn8wOzvwe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybwgq/btrxlq7emxZ/F2XljAzuR37eMn8wOzvwe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybwgq/btrxlq7emxZ/F2XljAzuR37eMn8wOzvwe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fybwgq%2Fbtrxlq7emxZ%2FF2XljAzuR37eMn8wOzvwe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;575&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Backbone의 핵심은 &lt;b&gt;CCM&lt;/b&gt;과 &lt;b&gt;DSM&lt;/b&gt;으로 Fig 2d에서 개별적으로 묘사되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LCNet은 총 5 stages로 구성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fisrt stage
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3x3 standard convolution with stride 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The rest stages
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논문의 DSM으로 시작됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 stage에서 &lt;b&gt;CCM&lt;/b&gt;의 수는 각각 &lt;code&gt;1, 1, 2, 6, 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;마지막 3 stages로부터의 feature maps는 multi-scale detection을 위해 사용됨&lt;/li&gt;
&lt;li&gt;각 모듈에서 bracket에서의 수는 convolutional kernels의 수를 나타냄을 숙지하셈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2.1 CCM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최근 몇 년 간 많은 효율적인 residual modules가 소개되어 왔음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g. residual bottleneck, inverted residual bottleneck and PEP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 이러한 방식들은 각 convolutional layer의 output feature channels의 수가 input feature channels의 수와 다르며,&lt;br /&gt;이는 곧 MAC의 증가를 초래함&lt;/li&gt;
&lt;li&gt;반면에 &lt;b&gt;CCM&lt;/b&gt;은 input과 output features 사이의 channels의 수의 일정함을 유지하며, 이는 MAC를 절약하게 되고 inference process의 속도를 빠르게 해 줌&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CCM&lt;/b&gt;은 Depthwise Convolution의 강력함과 residual connections가 결합됨&lt;/li&gt;
&lt;li&gt;구체적으로 Fig. 2d에 묘사되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Craav/btrxoIeY7wL/rfI69YzbCkcftapZTvkwV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Craav/btrxoIeY7wL/rfI69YzbCkcftapZTvkwV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Craav/btrxoIeY7wL/rfI69YzbCkcftapZTvkwV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCraav%2FbtrxoIeY7wL%2FrfI69YzbCkcftapZTvkwV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;325&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3x3 filter kernel은 각 channel마다 input을 convolved 시키고, output channels에 응답하여 독립적인 filtering 결과를 초래함&lt;/li&gt;
&lt;li&gt;그 후, 1x1 pointwise convolution이 channels의 linear combinations를 학습함으로써 channel dependency를 회복하는 데 사용됨&lt;/li&gt;
&lt;li&gt;그리고 이 두 동작들은 각 &lt;b&gt;CCM&lt;/b&gt;에서 한 번 더 수행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Channels의 수가 모두 달랐던 이전 연구에 반하여,&lt;br /&gt;feature map chanels의 수가 &lt;b&gt;CCM&lt;/b&gt;에서의 모든 block에서 일정하게 유지함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CCM&lt;/b&gt;의 효과는 ablation study section에서 설명함&lt;/li&gt;
&lt;li&gt;(이 논문은 object detection에 초점이 맞춰져 있지만, 연구진들은 visual tasks 관련 다른 존재하는 network 구조로 쉽게 전이되어 사용될 수 있다고 믿고 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2.2 DSM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Downsampling의 동작은 CNN구조에서 흔하게 사용됨&lt;/li&gt;
&lt;li&gt;Downsampling의 주 단점은 feature 해상도(resolution)의 감소이지만,&lt;br /&gt;또한 두 가지의 이점이 존재함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;깊은 layers가 classification을 향상하는 context를 더 모을 수 있도록 함&lt;/li&gt;
&lt;li&gt;Computation을 줄일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이에 따라, impalement 효율성과 detection performance 사이의 좋은 균형을 유지하기 위해서, &lt;b&gt;LCNet&lt;/b&gt;은 5 downsampling operations를 채택함&lt;/li&gt;
&lt;li&gt;대부분의 연구들은 여분의 computational budgets 없이 해상도를 줄이기 위해서 max-pooling layer 또는 stride 2를 가진 convolution을 채택했지만,&lt;br /&gt;그들의 관계를 고려하지 않고 filtered 된 responses를 바로 버림&lt;/li&gt;
&lt;li&gt;반면에, stride convolution은 pixel의 관계들을 점차 학습하면서 feature의 해상도를 줄일 수 있지만, 추가적인 computational cost가 발생함&lt;/li&gt;
&lt;li&gt;논문의 &lt;b&gt;DSM&lt;/b&gt;은 stride 2를 가진 DWC와 max-pooling을 결합하여, 두 함수의 이점을 수용함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6w6dS/btrxj8Fw31W/U6XMfsKfuAL4XiTOx8cWDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6w6dS/btrxj8Fw31W/U6XMfsKfuAL4XiTOx8cWDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6w6dS/btrxj8Fw31W/U6XMfsKfuAL4XiTOx8cWDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6w6dS%2Fbtrxj8Fw31W%2FU6XMfsKfuAL4XiTOx8cWDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;462&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig. 2e에서 설명되어 있듯이 &lt;b&gt;DSM&lt;/b&gt;은 두 개의 branches로 구성되어 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Left branches는 stride 2를 가진 3x3 DWC를 채택함&lt;/li&gt;
&lt;li&gt;Right branches는 max-pooling을 사용하여 실행됨&lt;/li&gt;
&lt;li&gt;이후 1x1 convolution은 2개의 branches의 outputs를 linearly 하게 결합하는데 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 RSAFPN&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLbLhM/btrxkN2JXxo/P5cLZmXru7hUHkRO4HsP41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLbLhM/btrxkN2JXxo/P5cLZmXru7hUHkRO4HsP41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLbLhM/btrxkN2JXxo/P5cLZmXru7hUHkRO4HsP41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLbLhM%2FbtrxkN2JXxo%2FP5cLZmXru7hUHkRO4HsP41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;260&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig. 1b에 보이듯이, &lt;b&gt;RSAFPN detection head&lt;/b&gt;을 구축하는 데 사용되는 &lt;b&gt;RSAM&lt;/b&gt;을 소개함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RSAM&lt;/b&gt;은 정확한 detection을 위한 low-level features를 guide(안내)하는 high-level features로부터의 semantic 정보를 이용함&lt;/li&gt;
&lt;li&gt;Low-level features는 local detail information을 가지고,&lt;br /&gt;high-level features는 classification을 위한 global semantic 정보를 담고 있음&lt;/li&gt;
&lt;li&gt;이에 따라, low-level features를 reweight 하기 위해서 high-level features로부터의 semantics으로 channel attention을 추상화시킴&lt;/li&gt;
&lt;li&gt;반면에 &lt;b&gt;FPN&lt;/b&gt; framework은 high-level features와 low-level features를 융합하는 mainstream 방법임&lt;/li&gt;
&lt;li&gt;그러므로, 제안한 &lt;b&gt;RSAM&lt;/b&gt;을 &lt;b&gt;FPN&lt;/b&gt;으로 소개함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXuDj0/btrxiYDTyY2/3W5fHRTSeyYJFnb2Bfgy0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXuDj0/btrxiYDTyY2/3W5fHRTSeyYJFnb2Bfgy0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXuDj0/btrxiYDTyY2/3W5fHRTSeyYJFnb2Bfgy0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXuDj0%2FbtrxiYDTyY2%2F3W5fHRTSeyYJFnb2Bfgy0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;475&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig. 3a에 묘사되어있듯이, 처음에 feature channels를 줄이는 pointwise convolution을 사용함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;High-level features의 수가 low-level features의 수보다 두 배 더 많기에&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;반면에, pointwise convolution의 outputs를 2번 upsample 하여, low-level features의 해상도에 매칭 시킴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LCCU&lt;/b&gt;는 high-level과 low-level features의 concatenation을 기반으로 context 정보를 잡아내기 위해서 채택됨&lt;/li&gt;
&lt;li&gt;이후, &lt;b&gt;CAM&lt;/b&gt;은 global attention을 사용하여 high-level semantics를 추상화시키는 데 사용됨&lt;/li&gt;
&lt;li&gt;마지막으로 semantic information은 &lt;b&gt;LCCU&lt;/b&gt;의 output이 reweighted feature maps를 생성하도록 guide 하는 데 사용됨&lt;/li&gt;
&lt;li&gt;구체적으로는 CAN에 의해 영감을 받아, &lt;b&gt;LCCU&lt;/b&gt;는 inference 속도를 향상하도록 computational cost를 절약하도록 설계됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjwuTH/btrxlp8liJL/LKOrVkfgq1EK5M92NUgkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjwuTH/btrxlp8liJL/LKOrVkfgq1EK5M92NUgkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjwuTH/btrxlp8liJL/LKOrVkfgq1EK5M92NUgkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjwuTH%2Fbtrxlp8liJL%2FLKOrVkfgq1EK5M92NUgkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;231&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig. 3b에 보이듯이 &lt;b&gt;LCCU&lt;/b&gt;에서 두 개의 3x3 depthwise convolution을 채택하여 context 정보를 잡아내도록 함&lt;/li&gt;
&lt;li&gt;첫 번째 1x1 convolution은 channels reduction을 위해서 사용되고,&lt;br /&gt;두 번 째 1x1은 depthwise convolution의 output을 섞기 위해서 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cokgb8/btrxivhGbNm/gPUdwCIbgipynhvOQa9WM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cokgb8/btrxivhGbNm/gPUdwCIbgipynhvOQa9WM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cokgb8/btrxivhGbNm/gPUdwCIbgipynhvOQa9WM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcokgb8%2FbtrxivhGbNm%2FgPUdwCIbgipynhvOQa9WM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;258&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fig. 3c에서 보이듯이 &lt;b&gt;CAM&lt;/b&gt;은 low-level feature maps가 high-level feature로부터 semantic information을 얻도록 도와줌&lt;/li&gt;
&lt;li&gt;첫째로, 강력한 semantic information을 생성하기 위해서 high-level features에 global average pooling을 이용함&lt;/li&gt;
&lt;li&gt;이후, 1x1 convolution은 &lt;b&gt;LCCU&lt;/b&gt; output의 feature 차원에 맞춰주기 위해서 dimension reduction을 위해서 사용됨&lt;/li&gt;
&lt;li&gt;이후 1x1 convolution의 output을 normalization 하기 위해 sigmoid function을 사용함&lt;/li&gt;
&lt;li&gt;마지막으로 abstract attention vector은 &lt;b&gt;LCCU&lt;/b&gt;의 output을 reweigh 하기 위해 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Experiments&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;method의 효율성을 증명하기 위해서 두 개의 자주 사용되는 일반적인 object detection datasets인 &lt;b&gt;PASCAL VOC 2007&lt;/b&gt;과 &lt;b&gt;MS COCO&lt;/b&gt;를 사용함&lt;/li&gt;
&lt;li&gt;논문에서 제안한 &lt;b&gt;CCM&lt;/b&gt;의 이점을 말하기 위해서 두 개의 ablation studies를 진행하였고, 제안한 &lt;b&gt;RSAM&lt;/b&gt;으로부터 성능 향상을 보임&lt;/li&gt;
&lt;li&gt;Sota와 비교하였을 때 제안한 모델이 accuracy와 efficiency trade-off의 관점에서 두 데이터셋에서 우월한 성능을 성취함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 Implementation details&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dataset&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PASCAL VOC 2007
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;20 object classs&lt;/li&gt;
&lt;li&gt;이미지의 해상도는 약 500x375 그리고 375x500 임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MS COCO
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;80 object classes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Hyper-parameters settings&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RSANet는 Tensorflow library로 구현됨&lt;/li&gt;
&lt;li&gt;GeForce RTX 2080ti GPU 환경에서 학습됨&lt;/li&gt;
&lt;li&gt;Adam optimizer&lt;/li&gt;
&lt;li&gt;320x320 input size에 24 mini-batch 혹은&lt;br /&gt;416x416 input size에 12 images&lt;/li&gt;
&lt;li&gt;Learning rate : warm up to 1e-3 for first epoch
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cosine scheduler를 따라서 나머지 iterations에 대해 1e-6만큼 줄임&lt;/li&gt;
&lt;li&gt;이렇게 한것은 연구진들이 시작부터 너무 갑자기 learning rate를 감소시키고 싶지 않았고, 마지막에서는 매우 작은 learning rate를 사용하여 해상도를 &amp;ldquo;refine&amp;rdquo; 시키고 싶어서 그런것임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;rarr; Traingin stable intially하게 만들기 위해서&lt;/li&gt;
&lt;li&gt;Computational resource의 제한을 위해서, imagenet dataset으로 pretrain된 model에 의존하지 않음&lt;/li&gt;
&lt;li&gt;즉, scratch부터 network를 학습시킴으로써, 어떤 제한 없이 전체 network의 모든 layer을 정제(refine)함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Evaluation metrics&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 효율성을 측정하기 위해서 Computational cost는 FLOPs로, model size는 parameter의 수로 평가하는 동시에,&lt;br /&gt;detection accuracy를 모든 class에 대해서 평가하기 위해서 mAP를 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 Evaluation on Pascal VOC 2007&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd9WuI/btrxkfE78PS/010GAQRP70RbrSy9pIOwY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd9WuI/btrxkfE78PS/010GAQRP70RbrSy9pIOwY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd9WuI/btrxkfE78PS/010GAQRP70RbrSy9pIOwY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd9WuI%2FbtrxkfE78PS%2F010GAQRP70RbrSy9pIOwY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;527&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN21Xq/btrxoWYRWIe/Znq0e7UgWWvaIjIb2CmDPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN21Xq/btrxoWYRWIe/Znq0e7UgWWvaIjIb2CmDPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN21Xq/btrxoWYRWIe/Znq0e7UgWWvaIjIb2CmDPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN21Xq%2FbtrxoWYRWIe%2FZnq0e7UgWWvaIjIb2CmDPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;763&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4.3 Evaluation on MS COCO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDNzhM/btrxlpN1YDk/KdsKipAbXexkiok2azpQCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDNzhM/btrxlpN1YDk/KdsKipAbXexkiok2azpQCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDNzhM/btrxlpN1YDk/KdsKipAbXexkiok2azpQCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDNzhM%2FbtrxlpN1YDk%2FKdsKipAbXexkiok2azpQCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;493&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ooIhN/btrxjoolwet/S5GuKt5YMk6h4XodbD7rq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ooIhN/btrxjoolwet/S5GuKt5YMk6h4XodbD7rq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ooIhN/btrxjoolwet/S5GuKt5YMk6h4XodbD7rq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FooIhN%2Fbtrxjoolwet%2FS5GuKt5YMk6h4XodbD7rq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;770&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4 Ablation study&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 Ablation study for CCM design&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FLOPs를 일정하게 유지하면서 ratio의 best setting를 찾아내기 위해서 다음과 같은 실험을 함&lt;/li&gt;
&lt;li&gt;ShuffleNetv2에 영감을 받아, 연구진들은 dot convolution의 input과 output channels의 일정함을 유지하는것이 memory access와 inference의 속도를 향상시킨다는것을 증명함&lt;/li&gt;
&lt;li&gt;Backbone인 &lt;b&gt;LCNet&lt;/b&gt;을 구성하는 &lt;b&gt;CCM&lt;/b&gt;모듈을 사용하고 pointwise convolution feature map의 point convolution의 input과 output channels의 비율을 변경함&lt;/li&gt;
&lt;li&gt;이와중에 FLOPs의 일정함은 유지함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccBqkZ/btrxjoolxg7/RMCwfur147EYSQnZkdqtBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccBqkZ/btrxjoolxg7/RMCwfur147EYSQnZkdqtBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccBqkZ/btrxjoolxg7/RMCwfur147EYSQnZkdqtBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccBqkZ%2Fbtrxjoolxg7%2FRMCwfur147EYSQnZkdqtBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;454&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번 째 열
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고정된 computational costs에서 backbone의 각 convolution layer의 다른 channel 수를 나타냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결과적으로 일정하게 유지하는것이 FPS가 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4.2 Ablation study for RSAM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RSAM&lt;/b&gt;의 효과를 증며하기 위해서, Pascal VOC 2007로 실험을 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RSAFPN&lt;/b&gt;안에 &lt;b&gt;RSAM&lt;/b&gt;을 추가함으로써 attention의 효과를 증명함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvUiWo/btrxjH9KDGx/IS3CNwlFDcUpnqYTT0J5S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvUiWo/btrxjH9KDGx/IS3CNwlFDcUpnqYTT0J5S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvUiWo/btrxjH9KDGx/IS3CNwlFDcUpnqYTT0J5S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvUiWo%2FbtrxjH9KDGx%2FIS3CNwlFDcUpnqYTT0J5S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;349&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Conclusion&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RSANet&lt;/b&gt;은 lightweight network backbone과 강력한 multi-scale feature fusion head를 개발하는데 중점을 두고, accuracy와 efficiency 사이의 trade-off을 성취함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/120</guid>
      <comments>https://luminitworld.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 26 Mar 2022 09:47:32 +0900</pubDate>
    </item>
    <item>
      <title>MLOps를 시작한 이유</title>
      <link>https://luminitworld.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주로 블로그에 올린 글의 거의 모든 글 유형이 기술에 대한 기술이었는데, 그 공부를 시작하게 된 이유, 어떠한 생각을 가졌는지 기록을 바로바로 해두는 것이 좋을 것 같아서 이렇게 기록을 해본다.&lt;/p&gt;
&lt;h1&gt;개요&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝, 딥러닝에 관심있고 관련 프로젝트 및 개발을 진행해본 입장에서 ML 프로젝트는 구현할 수 있는 경우의 수가 무수히 많다.&lt;/li&gt;
&lt;li&gt;Data collection &amp;amp; preprocessing, Model training, testing 등 각 과정마다 선택해야 할 사항들이 많으며 기존에는 이를 단순히 local 환경의 파일에 직접 저장시키면서 디렉터리에 정리하여 진행했다.&lt;/li&gt;
&lt;li&gt;프로젝트의 규모가 작은 경우는 위의 방식이 좀 지저분한(?) 방식이더라도 사람이 관리할 수 있을 정도가 되었다.&lt;/li&gt;
&lt;li&gt;하지만 큰 규모의 프로젝트인 경우, (물론 아직 학생이라 기업 규모의 프로젝트는 아니고 연구실 대회 정도...) 정말 다양한 실험들을 진행했는데, 모델 관리, 하이퍼파라미터 관리, data관리를 위의 방식으로 진행했을 때 상당히 힘이 들었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 좋은 방법이 있었겠지만 당시에는 단순 무식하게 학습된 model의 파일명에 핵심 파라미터 사이즈를 기입하여 구분을 하였다..
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) Roberta-16-2_1_1_1_1 .....&lt;/li&gt;
&lt;li&gt;: Roberta모델인데 batch size는 16, 5-class data 학습 비율은 2:1:1:1:1... 이게 무슨 해괴망측한 방법이었는가....&lt;/li&gt;
&lt;li&gt;암튼 당시에는 급한 대로 그렇게 진행을 하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MLOps라는 개념이 있다는 것을 안 지는 얼마 안 되었다.&lt;br /&gt;그리고 ML을 개발하는 입장에서 프로젝트의 규모가 점점 커지면서 이를 관리하려면 MLOps가 정말 필요하다는 것을 느꼈다.&lt;/li&gt;
&lt;li&gt;솔직히 당장의 혼자 진행하는 혹은 학부생 수준에서 진행하는 프로젝트 같은 경우 case by case이긴 하지만 일반적으로 MLOps를 관리할 정도로 크지는 않다.&lt;/li&gt;
&lt;li&gt;그리고 Service화를 위한 serving을 진행하는 것도 아니어서 지금 내 상황에서 굳이 필수적으로 요구되는 기술은 아닐 수도 있다.&lt;/li&gt;
&lt;li&gt;MLOps 환경을 구축하여 진행하는 것이 오히려 computational cost가 훨씬 더 들 것이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 코드로만 구성해서 바로바로 실행했던 구조를 따로따로 요소로 나누어서 docker형태로 contained 한 후 진행하게 되기 때문이다.&lt;/li&gt;
&lt;li&gt;(이 부분은 당장은 무슨 말인지 안 와닿아도 공부하다 보면 알게 될 것이다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그럼에도 불구하고 내가 MLOps를 시작한 이유는 내 개발 인생이 학부생에서 끝나는 것이 아니기 때문이다.&lt;/li&gt;
&lt;li&gt;학부생 때 진행한 프로젝트들은 보통 일정 성능 타협점에 다다르면 결과를 시각화해서 보여주고 끝이 난다. 그야 대다수가 서비스 운영을 목적으로 하는 것이 아닌 학문을 탐구하고 구현하는 목적이기 때문이다. 물론 학부생 때 직접 서비스를 운영하는 훌륭하신 분들도 많으시다. 하지만 공대생들은 알다시피 학교 수업을 듣는 동시에 여러 프로젝트를 진행하는 것이 일반적이므로 그러기 쉽지 않다. 나 또한 그랬고(여전히... 그렇고..) 프로젝트뿐만 아니라 할게 넘쳐난다^^; 물론 이러한 생각은 나의 굉장히 주관적인 견해이며, 누군가에겐 핑계로 들릴 수도 있다. 하지만 나도 한 열심했다고 생각하......ㄴ다!! 공부하는 방향과 투자에 따라 경험의 차이가 존재하는 것 같다.&lt;/li&gt;
&lt;li&gt;구현한 모델은 이후 서비스화가 이뤄지지 않기 때문에 그리고 시간적, 컴퓨팅적 제약으로 보통 보완과 추후 관리가 이뤄지지 않는다.&lt;/li&gt;
&lt;li&gt;하지만 개발한 모델을 서비스화 해야 한다면 상황은 정말 달라진다.&lt;br /&gt;개발 당시 좋은 성능이 나왔다고 끝나지 않는다.&lt;br /&gt;당시 test 데이터로 성능이 좋게 나왔어도, 서비스로 serving 된 후 사용자들이 test로 사용하는 데이터는 성능이 좋지 않을 수도 있다.&lt;br /&gt;또한 모델을 개발하고 지속적인 성능 update, 새로운 class 추가 등 다양한 개선들이 필요할 것이다.&lt;/li&gt;
&lt;li&gt;위에서 말했듯이 내 개발 인생은 졸업하면 끝나는 것이 아니고 오히려 시작이기에 이를 공부해야겠다는 생각이 들었고, 또한 computational cost는 들더라도 여러 실험을 할 때 그리고 규모를 늘려갈 때 MLOps를 구축해보는 것이 지금 그리고 앞으로 내가 진행할 프로젝트에 사용해도 유용할 것이라고 생각을 했고 필요하다고 느꼈다.&lt;/li&gt;
&lt;li&gt;그래서 MLOps가 무엇인지 서칭하고 공부를 했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서 MLOPS가 뭔데??&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLOps는 다음과 같이 간단하게 정의될 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ML 모델을 프로덕션으로 전환하는 프로세스를 간소화하고, 이를 유지 관리하고 모니터링을 하는데 주안점을 둔 머신러닝 엔지니어링의 핵심적 기능으로 ML과 DevOps의 어휘를 합쳐서 MLOps라고 부른다.&lt;/li&gt;
&lt;li&gt;Engineer과 Reasearcher 사이의 CI/CD 그리고 CT까지 더하여 유용하게 하는 기술이다.&lt;/li&gt;
&lt;li&gt;더 자세한 설명은 구글이 정말 잘 알려준다.&lt;/li&gt;
&lt;li&gt;개인적으로 MLOps를 잘 설명하고 참조한 링크는 다음과 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.slideshare.net/zzsza/mlops-kr-mlops-210605&quot;&gt;https://www.slideshare.net/zzsza/mlops-kr-mlops-210605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fullstackdeeplearning.com/spring2021/#week-5-ml-projects&quot;&gt;https://fullstackdeeplearning.com/spring2021/#week-5-ml-projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xZKtofBe18I&quot;&gt;https://www.youtube.com/watch?v=xZKtofBe18I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;이것 외로 더 있는데 바로 위에 있는 피피티와 유튜브 링크에서 MLOps 공부 강의 추천을 해줘서 참조하면 좋을 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그래 MLOps 뭔지 대략 알았어! 그래서 구현하려면 난 뭐부터 시작해야...?&lt;/li&gt;
&lt;li&gt;처음에 너무 막막했다. 왜 필요한지 알겠고 어떻게 쓰이는지 대략 알겠는데 그래서 뭐 부터 구현해야 하는 거야...?&lt;/li&gt;
&lt;li&gt;잘 모르겠어서 방향성을 잡기 위해 더 서칭 해보고 찾아보았다.&lt;/li&gt;
&lt;li&gt;일단 추가적으로 찾아보니 MLOps에도 Level 수준이라는 것이 존재했다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Level 0~2까지 총 3개의 레벨로 규모와 CI/CD/CT의 여부, 서비스 배포 여부 등에 따라 나뉜다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;내가 잘 못 찾은 것일 수도 있지만, 각 레벨에 대한 전체적으로 필요한 기능에 대한 구조는 나와 있지만, 뚜렷하게 자주 쓰이는 구조의 방식이 존재하는 것은 아니었다. (물론 따지고 보면 모든 분야가 그렇겠지만 다른 분야에 비해 상대적으로 정보가 부족하다고 개인적으로 느꼈다)&lt;/li&gt;
&lt;li&gt;또한 MLOps 관련 library와 tool들이 이렇게나 많다. 아래의 깃헙 링크에서 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/EthicalML/awesome-production-machine-learning&quot;&gt;https://github.com/EthicalML/awesome-production-machine-learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;그래서 많은 외국 블로그 글들에서 MLOps를 시작할 때 구현하고자 하는 목적과 방향성을 먼저 잡아야 한다고 이야기를 많이 한다.&lt;/li&gt;
&lt;li&gt;뭐 이 말도 어느 분야에서나 마찬가지라서 당연한 소리 하고 있다고 할 수 있지만 상대적으로 다른 분야들보다 따라 해 볼 자료가 적기에, 내게는 좀 더 와닿았다.&lt;/li&gt;
&lt;li&gt;즉 다시 말하자면, MLOps를 만드는 이유와 목적에 따라 규모가 다르게 설정되고 구현하는 범위도 달라진다.&lt;/li&gt;
&lt;li&gt;예를 들어 설명하자면, 앞서 MLOps를 공부한 이유에서 언급한 하나로 서비스를 운영하고 serving에 힘을 쓰게 된다면 service 배포까지의 flow를 구축하는 것이 구현될 수도 있고 구현되지 않을 수도 있다.&lt;br /&gt;보통 service를 하는 기업의 입장에서는 필수적이다.&lt;br /&gt;하지만 research 성향을 주로 띄고 있는 당장의 나 같은 경우는 service를 serving 하는 목적보다 모델을 관리하고 반복적인 flow를 줄이는 프로젝트 규모 관리가 주요 목적이 된다.&lt;/li&gt;
&lt;li&gt;MLOps는 공부해야 하는 범위와 규모가 너무 커서 당장에 모든 것을 구현하는 것은 어렵다.&lt;/li&gt;
&lt;li&gt;그래서 나는 그중 파이프라인 구축을 중점을 두어서 여러 실험을 체계적으로 진행하고 모델 관리를 용이하는 것을 주목적을 잡고 공부하고 구현하는 것을 우선순위로 잡게 되었다.&lt;/li&gt;
&lt;li&gt;목적과 구축 이유를 잡았으니 어떠한 tool을 사용해서 구현할지 정하고, 해당 tool을 공부해야 한다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;파이프라인 구축&amp;rdquo; 이것이 당장 우선 시 되어야 하는 과제이고 나는 파이프라인을 구축하는데 &lt;b&gt;Kubeflow&lt;/b&gt;를 선택하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Why kubeflow?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그 많은 MLOps tool 중에서 Kubeflow를 고른 이유는 다음과 같다.&lt;/li&gt;
&lt;li&gt;다른 tools와 세부적인 비교는 직접 해보지 않아서 제일 적합한 선택이 아닐 수도 있다.&lt;br /&gt;하지만 내 상황에서는 제일 적합한 선택이라고 생각한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kubernetes를 사용하고 싶었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DevOps에서 거의 모든 서비스가 docker 형태로 container화 되어 container들을 관리하는 식으로 구축이 된다.&lt;br /&gt;Container을 관리하는 대표적으로 인기 있고 실제로 많이 쓰는 tool은 google에서 만든 Kubernetes (K8s)이다.&lt;br /&gt;이러한 Kubernetes 기반으로 구현되는 MLOps tool이 Kubeflow이다.&lt;br /&gt;Kubernetes에 대해서 공부해보고 싶었고, 실제로 많이 사용되는 만큼 Kubernetes에서 운영되는 Kubeflow가 호환성이 좋다고 생각했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tasks를 정의하는데 YAML대신 python으로도 정의할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MLOps를 처음 공부하는데 좀 더 익숙한 python으로 구현해보는 것이 좋다고 생각했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google에서 만든 만큼 공식 Document가 자세히 나와 있고 다른 tool보다 상대적으로 자료가 많았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kubeflow에 대해서 다른 MLOps tool과 비교했을 때 좋지 않다는 관점도 존재한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.datarevenue.com/en-blog/airflow-vs-luigi-vs-argo-vs-mlflow-vs-kubeflow&quot;&gt;Airflow vs Luigi vs Argo vs Kubeflow vs MLFlow (datarevenue.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 제한된 시간에 공부하고 구현하는 데 위와 같은 이유에 따라 Kubeflow를 구현하는데 사용하기로 결정했다.&lt;/li&gt;
&lt;li&gt;Kubeflow를 사용하는 것은 맞는데 나는 Kubeflow의 다양한 기능들을 모두 적극 활용하는 것은 아니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;오직 파이프라인 구축에만 Kubeflow을 사용하는 것이다.&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;파이프라인 뼈대를 구축하는데 Kubeflow components 중 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Kubeflow-pipeline components&lt;/b&gt;&lt;/span&gt;만 사용할 것이다.&lt;/li&gt;
&lt;li&gt;Hyperparameter관리, 모델 관리 등은 다른 tool을 사용할 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[참조]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://databricks.com/kr/glossary/mlops&quot;&gt;https://databricks.com/kr/glossary/mlops&lt;/a&gt;&lt;/p&gt;</description>
      <category>Project</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/119</guid>
      <comments>https://luminitworld.tistory.com/119#entry119comment</comments>
      <pubDate>Sun, 20 Mar 2022 01:17:44 +0900</pubDate>
    </item>
    <item>
      <title>EPSANet : An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network 정리</title>
      <link>https://luminitworld.tistory.com/113</link>
      <description>&lt;h1&gt;Abstract&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EPSANet&lt;/li&gt;
&lt;li&gt;Novel lightweight and effective attention method&lt;/li&gt;
&lt;li&gt;Replacing the 3x3 convolution with the PSA module in the bottleneck blocks of the ResNet&lt;/li&gt;
&lt;li&gt;Be developed by stacking ResNet-style EPSA blocks&lt;/li&gt;
&lt;li&gt;Strong multi-scale representation ability for various computer vision tasks&lt;/li&gt;
&lt;li&gt;Outperforming most of the state-of-the-art channel attention methods&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Specifically two types of attention methods
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) &lt;b&gt;Channel attention&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ex) Squeeze-and-extraction (SE module)&lt;/li&gt;
&lt;li&gt;&amp;rarr; Ignores the importance of spatial information&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2) &lt;b&gt;Spatial attention&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beETGg/btrtQnT0CBl/Io1iTew9E1S83SQYEqKnc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beETGg/btrtQnT0CBl/Io1iTew9E1S83SQYEqKnc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beETGg/btrtQnT0CBl/Io1iTew9E1S83SQYEqKnc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeETGg%2FbtrtQnT0CBl%2FIo1iTew9E1S83SQYEqKnc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;412&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problems&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) How to efficiently capture and exploit the &lt;b&gt;&lt;code&gt;spatial information&lt;/code&gt;&lt;/b&gt; of the feature map with &lt;b&gt;&lt;code&gt;different scales&lt;/code&gt; to enrich the feature space&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Different scales를 가진 feature map의 spatial information을 어떻게 효율적으로 잡아내고 이용할 지&lt;/li&gt;
&lt;li&gt;2) &lt;b&gt;Channel or spatial attention&lt;/b&gt; can only effectively capture the local information &lt;b&gt;but fail in establishing &lt;code&gt;a long-range channel dependency&lt;/code&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Solution&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pyramid Squeeze Attention (PSA)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;Low-cost&lt;/code&gt;&lt;/b&gt; and &lt;code&gt;&lt;b&gt;high-performance&lt;/b&gt;&lt;/code&gt; novel module&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;&lt;b&gt;multi-scale pyramid convolution&lt;/b&gt;&lt;/code&gt; structure&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&amp;rarr; to integrate the information of the input feature map*&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Cross-dimension interaction
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;By extracting the channel-wise attention weight of the multi-scale feature maps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Contribution&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 세분화된 level에서 multi-scale spatial information을 효율적으로 추출할 수 있는 EPSA block을 제안함&lt;/li&gt;
&lt;li&gt;EPSA block은 매우 flexible하고 scalable하기에 computre vision의 많은 task에 대해서 다양한 network architectures에 적용될 수 있음&lt;/li&gt;
&lt;li&gt;EPSA block은 더 풍부한 multi-scale feature representation을 배울 수 있고 cross-dimension channel-wise attention weight를 유동적으로 재조정할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. Related work&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 연구들의 더 많은 computational cost가 요구되는 정교한 attention modules를 설계에 집중하거나 long-range channel dependency를 설립할 수 없었음&lt;/li&gt;
&lt;li&gt;PSA를 제안하여 low model complexity를 가진 attention weight를 학습하는것을 목표로 두게하고, long-range channel dependency를 설립하기 위해 local과 global attention을 효율적으로 통합함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. Method&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 Revisting Channel Attention&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Channel attention&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SE block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UZzVe/btrtWu5DGDq/4xKp6Mwhd9uIXEFMRHwrkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UZzVe/btrtWu5DGDq/4xKp6Mwhd9uIXEFMRHwrkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UZzVe/btrtWu5DGDq/4xKp6Mwhd9uIXEFMRHwrkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUZzVe%2FbtrtWu5DGDq%2F4xKp6Mwhd9uIXEFMRHwrkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;225&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs347J/btrtWtr9Dpw/VxqbZ5C9zfdTKfD5jboohk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs347J/btrtWtr9Dpw/VxqbZ5C9zfdTKfD5jboohk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs347J/btrtWtr9Dpw/VxqbZ5C9zfdTKfD5jboohk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs347J%2FbtrtWtr9Dpw%2FVxqbZ5C9zfdTKfD5jboohk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;119&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPSoJj/btrtVoki8jX/CTIspbVA2kqM6CCcrjkc8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPSoJj/btrtVoki8jX/CTIspbVA2kqM6CCcrjkc8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPSoJj/btrtVoki8jX/CTIspbVA2kqM6CCcrjkc8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPSoJj%2FbtrtVoki8jX%2FCTIspbVA2kqM6CCcrjkc8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;47&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;With two fully-connected layers, the linear information among channels
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Be helpful for the interaction of the information high and low channel dimensions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The above one is named &lt;b&gt;&lt;code&gt;SEWeight module&lt;/code&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 PSA Module&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UbQWt/btrtWvcqoqH/Xg1KKHTTABiAjXKKP3nbtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UbQWt/btrtWvcqoqH/Xg1KKHTTABiAjXKKP3nbtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UbQWt/btrtWvcqoqH/Xg1KKHTTABiAjXKKP3nbtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUbQWt%2FbtrtWvcqoqH%2FXg1KKHTTABiAjXKKP3nbtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;264&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Be implemented in four steps
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) &lt;b&gt;Multi-scale featue map&lt;/b&gt; on channel-wise는 &lt;code&gt;&lt;b&gt;Squeeze and Concat (SPC)&lt;/b&gt;&lt;/code&gt; 를 수행함으로써 얻어짐&lt;/li&gt;
&lt;li&gt;2) Channel-wise attention vector은 다른 scales를 가진 feature map의 attention을 추출하는 &lt;b&gt;&lt;code&gt;SEWeight module&lt;/code&gt;&lt;/b&gt;을 사용함으로써 얻어짐&lt;/li&gt;
&lt;li&gt;3) 재보정된 multi-scale channel의 weight는 channel-wise attention vector을 재보정하는 Softmax를 사용함으로써 얻어짐&lt;/li&gt;
&lt;li&gt;4) Element-wise 곱의 계산은 weight와 일치하는 feature map을 재보정하는데 적용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종적으로 multi-scale feature information가 풍부한 refined feature map을 output으로 얻을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SPC module&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWiAs/btrtKDqdUu9/mMBGA97kxKQTgakJ56PiFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWiAs/btrtKDqdUu9/mMBGA97kxKQTgakJ56PiFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWiAs/btrtKDqdUu9/mMBGA97kxKQTgakJ56PiFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWiAs%2FbtrtKDqdUu9%2FmMBGA97kxKQTgakJ56PiFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1010&quot; height=&quot;716&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제안된 PSA에서 multi-scale feature extraction을 수행하기 위한 핵심 연산은 &lt;code&gt;&lt;b&gt;SPC&lt;/b&gt;&lt;/code&gt; 임&lt;/li&gt;
&lt;li&gt;Input feature map의 &lt;b&gt;&lt;code&gt;Spatial information&lt;/code&gt;&lt;/b&gt;&amp;nbsp;은 multi-branch 방식으로 추출함&lt;/li&gt;
&lt;li&gt;&amp;rarr; By doing this, They can obtain &lt;b&gt;more abundant positional information of the input tensor&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Using &lt;b&gt;&lt;code&gt;multi-scale&lt;/code&gt; convolutional kernels&lt;/b&gt; in a &lt;code&gt;&lt;b&gt;pyramid structure&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&amp;rarr; Different spatial resolutions and depths can be generated&lt;/li&gt;
&lt;li&gt;$C$ : The input channel dimension of each branch&lt;/li&gt;
&lt;li&gt;$S$ : Number of branches&lt;/li&gt;
&lt;li&gt;$C'=C/S$ : $F_i$&amp;rsquo;s channel dimension ( $i=0,1,...,S-1$ )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$C$ should be divisible by $S$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 branch에 대하여 multi-scale spatil inforamtion을 독립적으로 학습하고,&lt;br /&gt;local 방식으로 &lt;code&gt;&lt;b&gt;cross-channel interaction&lt;/b&gt;&lt;/code&gt;을 형성함&lt;/li&gt;
&lt;li&gt;Parameters의 양에 대한 큰 향상은 kernel sizes의 증가와 함께 초래할 것임&lt;/li&gt;
&lt;li&gt;Computationa cost를 증가시키지 않으면서 서로 다른 kernel scales의 input tensor을 처리하기 위해서 &lt;b&gt;&lt;code&gt;Group convolution&lt;/code&gt;&lt;/b&gt;을 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Grouped Convolution&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;124&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Epvy/btrtMKoQ6H3/7QaVVkp3BQ68n80CZSHAUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Epvy/btrtMKoQ6H3/7QaVVkp3BQ68n80CZSHAUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Epvy/btrtMKoQ6H3/7QaVVkp3BQ68n80CZSHAUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Epvy%2FbtrtMKoQ6H3%2F7QaVVkp3BQ68n80CZSHAUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;124&quot; height=&quot;45&quot; data-origin-width=&quot;124&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4d4DM/btrtMJcrgWh/Phk2kpft7twvqvVpZOtkbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4d4DM/btrtMJcrgWh/Phk2kpft7twvqvVpZOtkbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4d4DM/btrtMJcrgWh/Phk2kpft7twvqvVpZOtkbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4d4DM%2FbtrtMJcrgWh%2FPhk2kpft7twvqvVpZOtkbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;38&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$G=2^{(k_i-1)/2}$ : Group size&lt;/li&gt;
&lt;li&gt;$k_i=2\times(i+1)+1$&lt;/li&gt;
&lt;li&gt;$F_i\in R^{C^`\times H \times W}$&lt;/li&gt;
&lt;li&gt;$F\in R^{C \times H \times W}$ : Obtained multi-scale feature map&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkAyl/btrtQpjYOF3/jDXakjhLnCkoRqX0K2kJqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkAyl/btrtQpjYOF3/jDXakjhLnCkoRqX0K2kJqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkAyl/btrtQpjYOF3/jDXakjhLnCkoRqX0K2kJqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkAyl%2FbtrtQpjYOF3%2FjDXakjhLnCkoRqX0K2kJqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;39&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;By extracting the channel attention weight information from the multi-scale pre-processed feature map, the attention weight vectors with different scales are obtained&lt;/li&gt;
&lt;li&gt;$Z_i\in R^{C^` \times 1 \times 1}$ : Attention weight&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFBaZy/btrtO7Rr6TD/vLJISoDfuwOwDk7zAhdGA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFBaZy/btrtO7Rr6TD/vLJISoDfuwOwDk7zAhdGA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFBaZy/btrtO7Rr6TD/vLJISoDfuwOwDk7zAhdGA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFBaZy%2FbtrtO7Rr6TD%2FvLJISoDfuwOwDk7zAhdGA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;41&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Concatenate the Attention weights&lt;/li&gt;
&lt;li&gt;&amp;rarr; In order to &lt;b&gt;realize the interaction of attention information&lt;/b&gt; and &lt;b&gt;fuse&lt;/b&gt; the cross-dimensions vector &lt;b&gt;without destroying the original channel attention vector&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwSKgj/btrtO74VFqj/x3nVRWxlEpm6GJVArUHtmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwSKgj/btrtO74VFqj/x3nVRWxlEpm6GJVArUHtmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwSKgj/btrtO74VFqj/x3nVRWxlEpm6GJVArUHtmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwSKgj%2FbtrtO74VFqj%2Fx3nVRWxlEpm6GJVArUHtmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;81&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Be used to adaptively select different spatial scales&lt;/li&gt;
&lt;li&gt;By doing this, the interaction between &lt;b&gt;&lt;code&gt;local and global channel attention&lt;/code&gt;&lt;/b&gt; is realized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djRgWA/btrtNROTLkS/B6wrwvHvDyWnzQIEJdzjwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djRgWA/btrtNROTLkS/B6wrwvHvDyWnzQIEJdzjwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djRgWA/btrtNROTLkS/B6wrwvHvDyWnzQIEJdzjwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjRgWA%2FbtrtNROTLkS%2FB6wrwvHvDyWnzQIEJdzjwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;35&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$att_i$들도 concatenate시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pP6ew/btrtXrATBdE/12XcgkOneCz6NkF8KQril0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pP6ew/btrtXrATBdE/12XcgkOneCz6NkF8KQril0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pP6ew/btrtXrATBdE/12XcgkOneCz6NkF8KQril0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpP6ew%2FbtrtXrATBdE%2F12XcgkOneCz6NkF8KQril0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;38&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Attention weight과 $F_i$ channel-wise multiplication 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sDK0U/btrtJAzsXL6/q8ngynQmzxRhoWRMHsFTf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sDK0U/btrtJAzsXL6/q8ngynQmzxRhoWRMHsFTf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sDK0U/btrtJAzsXL6/q8ngynQmzxRhoWRMHsFTf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsDK0U%2FbtrtJAzsXL6%2Fq8ngynQmzxRhoWRMHsFTf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;36&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Concatenation 계산이 summation보다 더 효율적
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Original feature map의 정보를 제거하지 않으면서 feature representation을 유지할 수 있기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PSA module can integrate the &lt;code&gt;&lt;b&gt;multi-scale spatial information&lt;/b&gt;&lt;/code&gt; and &lt;b&gt;&lt;code&gt;the cross-channel attention&lt;/code&gt;&lt;/b&gt; into the block for each feature map&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 Network Design&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btzz2x/btrtRDPpvrF/zIsetVC8pfqVDLQteDic0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btzz2x/btrtRDPpvrF/zIsetVC8pfqVDLQteDic0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btzz2x/btrtRDPpvrF/zIsetVC8pfqVDLQteDic0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtzz2x%2FbtrtRDPpvrF%2FzIsetVC8pfqVDLQteDic0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;469&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Be further obtained by &lt;b&gt;replacing the 3x3 convolution&lt;/b&gt; with &lt;b&gt;the PSA module&lt;/b&gt; at corresponding positions &lt;b&gt;in the bottleneck blocks&lt;/b&gt; of ResNet&lt;/li&gt;
&lt;li&gt;Multi-scale spatial information과 cross-channel attention이 통합되어 있기에 multi-scale spatial information을 더 세분화된 수준에서 추출할 수 있고 &lt;b&gt;&lt;code&gt;long-range channel dependency&lt;/code&gt;&lt;/b&gt;를 구축할 수 있음&lt;/li&gt;
&lt;li&gt;EPSANet은 제안된 EPSA blocks를 ResNet style로 쌓음으로써 구축됨&lt;/li&gt;
&lt;li&gt;Structure of EPSANet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJnCz/btrtKDwVypv/Q2T5SV13fPm1RPcRmkQ2F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJnCz/btrtKDwVypv/Q2T5SV13fPm1RPcRmkQ2F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJnCz/btrtKDwVypv/Q2T5SV13fPm1RPcRmkQ2F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJnCz%2FbtrtKDwVypv%2FQ2T5SV13fPm1RPcRmkQ2F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;511&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;4. Experiments&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 Implementation Details&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Image classification tasks에 대해서는 ResNet를 backbone model로 사용하고, ImageNet dataset으로 experiments를 수행함&lt;/li&gt;
&lt;li&gt;The standard augmentation scheme는 실행되었고, input tensor의 크기는 랜덤하게 horizontal fliping 과 normalization에 의해서 224x224로 잘림&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 Image Classification on ImageNet&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1VHXK/btrtJAGfo1q/WFJd6OuMBCZKiiS0jIkMZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1VHXK/btrtJAGfo1q/WFJd6OuMBCZKiiS0jIkMZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1VHXK/btrtJAGfo1q/WFJd6OuMBCZKiiS0jIkMZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1VHXK%2FbtrtJAGfo1q%2FWFJd6OuMBCZKiiS0jIkMZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;710&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전반적으로 더 적은 parameters와 낮은 computational cost로 더 좋은 정확도를 성취하거나 state-of-the-art 기록을 냄&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.3 Object Detection on MS COCO&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSqrP/btrtWvcqUmJ/8mo66jPO1P6ZsXA4vr7Klk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSqrP/btrtWvcqUmJ/8mo66jPO1P6ZsXA4vr7Klk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSqrP/btrtWvcqUmJ/8mo66jPO1P6ZsXA4vr7Klk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSqrP%2FbtrtWvcqUmJ%2F8mo66jPO1P6ZsXA4vr7Klk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;673&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EPSANet-50(Small) outperforms the SENet-50 by a large margin with less parameters and lower computational cost&lt;/li&gt;
&lt;li&gt;The EPSANet-50(LARGE) can achieve the best performance compared with the other attention methods&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.4 Instance Segmentation on MS COCO&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZCvB7/btrtIOEDUTF/anfPUorneLuKvoNOKU1nV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZCvB7/btrtIOEDUTF/anfPUorneLuKvoNOKU1nV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZCvB7/btrtIOEDUTF/anfPUorneLuKvoNOKU1nV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZCvB7%2FbtrtIOEDUTF%2FanfPUorneLuKvoNOKU1nV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;326&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Propsed PSA module outperforms the other channel attention methods by a considerably larger margin&lt;/li&gt;
&lt;li&gt;These results verified the effectiveness of proposed PSA module&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.5 Ablation Study&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPMIC/btrtId5Ka1Q/y39sAmxHzOsBQEd4sObTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPMIC/btrtId5Ka1Q/y39sAmxHzOsBQEd4sObTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPMIC/btrtId5Ka1Q/y39sAmxHzOsBQEd4sObTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPMIC%2FbtrtId5Ka1Q%2Fy39sAmxHzOsBQEd4sObTZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;160&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Adjusting the group size to verify the effectiveness of prorposed network on the ImageNet dataset&lt;/li&gt;
&lt;li&gt;Computatilnal cost를 증가시키지 않고 spatial domain에서 multi-scale의 location information을 이용하기 위해서, 서로 다른 scale을 가진 각 feature map에 대해 독립적으로 group convolution을 적용함&lt;/li&gt;
&lt;li&gt;가장 밑의 결과가 비교적 균형잡힘&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;5. Concolusion&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제안된 PSA module은 multi-scale spatial information과 channel attention vector안의 dimensions에 대한 중요한 features를 추출할 수 있음&lt;/li&gt;
&lt;li&gt;제안된 EPSA block은 multi-scale representation능력을 더 세분화된 수준으로 향상시킬 수 있고 long-range channel dependency를 발전시킬 수 있음&lt;/li&gt;
&lt;li&gt;제안된 EPSA Net은 multi-scale contextual features와 image-level categorical information을 효율적으로 통합할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;My Opinions&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Softmax를 전체 $Z$에 적용한것이 아닌 각 spatial 정보를 담고 있는 하나의 $Z_i$에 적용했기 때문에 local한 정보가 포함되어 있고 이러한 $att_i$들을 concatenate한 후 multi-scale channel인 $F_i$에 attention으로 전체적으로 적용했기 때문에 global 정보를 담고 있다고 볼 수 있다고 생각하는것 같음&lt;/li&gt;
&lt;li&gt;그런데 softmax를 전체에 취하지 않는 저런 형식은 local정보는 잡는다는것은 납득이 가지만 서로 다른 multi-scale들 중에서 비교적 어떤것을 더 집중해서 볼 지에 대한 관계는 좀 약할것 같음&lt;/li&gt;
&lt;li&gt;내 생각은 이미지를 볼 때 큰 filter 특징, 작은 filter 특징 모두 고려하고자 하는 차원에서 하면 저렇게 local하게 softmax하는것은 맞다고 동의함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;github link&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(논문에 존재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://paperswithcode.com/method/spatial-attention-module&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://paperswithcode.com/method/spatial-attention-module&lt;/a&gt; &amp;nbsp;&lt;/p&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <category>attention</category>
      <category>deeplearning</category>
      <category>EPSANet</category>
      <category>image</category>
      <category>Pyramid</category>
      <category>Vision</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/113</guid>
      <comments>https://luminitworld.tistory.com/113#entry113comment</comments>
      <pubDate>Mon, 21 Feb 2022 12:30:28 +0900</pubDate>
    </item>
    <item>
      <title>UW-NET : An Inception-Attention Network For Underwater Image Classification</title>
      <link>https://luminitworld.tistory.com/112</link>
      <description>&lt;h1&gt;Abstract&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;For underwater image classification&lt;/li&gt;
&lt;li&gt;Simulate the visual correlation of background attention with image understanding for special environments, such as fog and underwater by I-A module
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I-A moudule : Inception-Attention module&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Underwater image : Complex distortions (low contrast, blurring, non-uniform brightness...)&lt;/li&gt;
&lt;li&gt;Three key points
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) 서로 다른 환경들에서 찍힌 underwater images의 background는 다양함&lt;/li&gt;
&lt;li&gt;2) Salient objects는 underwater환경뿐만 아니라, air환경에도 존재하고,&lt;br /&gt;salient objects로부터 추출된 features는 underwater images의 분류를 해결하는데 주로 의지하여 사용될 수 없음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Salient objects ( e.g. ruins, fish, diver)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3) Underwater classification은 dualistic classification task이기 때문에, 제안된 구조는 over-fitting을 피하기 위해서 simple해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Problems&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dataset이 부족할 때, CNN의 depth와 width를 증가시키면 over-fitting이 더 쉽게 발생할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Solutions&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 문제를 해결하기 위해, 다음을 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Multi-scale convolution&lt;/b&gt; and &lt;b&gt;pooling&lt;/b&gt; on a level of CNN
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;To output multi-scale features&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Attention mechansim&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사람들이 Underwater images를 이해할 때, Background area와 같은 large-scale features가 visual attention mechanism에서 중요한 역할을 한다는것을 찾음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Natural scene image classifcation에서 적용된 attention mechanism과는 달리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UW-Net은 I-A modules를 구축함으로써, images의 background features에 더 attention함&lt;br /&gt;그럼으로써 더 나은 성능을 성취함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAnT0p/btrtoAmaeTX/OhRzcJleqknTdsBpkYml8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAnT0p/btrtoAmaeTX/OhRzcJleqknTdsBpkYml8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAnT0p/btrtoAmaeTX/OhRzcJleqknTdsBpkYml8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAnT0p%2FbtrtoAmaeTX%2FOhRzcJleqknTdsBpkYml8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;927&quot; height=&quot;520&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Proposed Approach&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ubnr2/btrtlUleHzB/RODxCZPcaLBwZyKC8yXIc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ubnr2/btrtlUleHzB/RODxCZPcaLBwZyKC8yXIc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ubnr2/btrtlUleHzB/RODxCZPcaLBwZyKC8yXIc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUbnr2%2FbtrtlUleHzB%2FRODxCZPcaLBwZyKC8yXIc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;926&quot; height=&quot;575&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;First forwared to a convolution layer with 7x7 size of kernels&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;rarr; To obtain large reception fields&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 Inception-Attention Module&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Classical inception models : constructed by multiple sizes of convolution kernels&lt;/li&gt;
&lt;li&gt;하지만 모든 convolutino kernel의 추출된 features가 current image classification task에 긍정적으로 연관되는것은 아님
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를들어, kernel with large size는 global information을 묘사하는 경향이 있지만, 세밀한 image classification에 거의 영향이 없을것임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.1 Inception Module&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Underwater images
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Recognition of underwater image is based more on the &lt;b&gt;global features&lt;/b&gt; of the image&lt;/li&gt;
&lt;li&gt;Poor quality due to the effects of lighting absorption and scattering&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 특징을 기반으로,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Convolution kernel with &lt;b&gt;large size&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Average pooling&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&amp;rarr; To reduce the impact of local features of the image on the final classification*&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Convolution kernel sizes in the &lt;b&gt;inception module&lt;/b&gt; which are used in the experiments
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1x1&lt;/li&gt;
&lt;li&gt;5x5&lt;/li&gt;
&lt;li&gt;7x7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.2 Attention Module&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAXzj9/btrtmV5dOC9/UqAJLOfYZloqZKBxo3kM7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAXzj9/btrtmV5dOC9/UqAJLOfYZloqZKBxo3kM7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAXzj9/btrtmV5dOC9/UqAJLOfYZloqZKBxo3kM7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAXzj9%2FbtrtmV5dOC9%2FUqAJLOfYZloqZKBxo3kM7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;465&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Soft attention을 기반으로 attention module을 구축함&lt;/li&gt;
&lt;li&gt;인간의 underwater image의 인식을 구현하기하는 trunk branch와 mask branch로 구성되어 있음&lt;/li&gt;
&lt;li&gt;Trunk branch
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Inspired by residual network&lt;/li&gt;
&lt;li&gt;Output the previous layer as input directly&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&amp;rarr; So that the basic features of the image can be transmitted to the deep layers of network*&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mask branch
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Donwsampling &amp;rarr; Upsampling&lt;/li&gt;
&lt;li&gt;Activation function for first and second convolution layers are Relu and sigmoid&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI7mc9/btrtsVvRoKD/hHUzwg53HoNwe9M1BjPKgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI7mc9/btrtsVvRoKD/hHUzwg53HoNwe9M1BjPKgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI7mc9/btrtsVvRoKD/hHUzwg53HoNwe9M1BjPKgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI7mc9%2FbtrtsVvRoKD%2FhHUzwg53HoNwe9M1BjPKgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;40&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$F(x)$ : Final output&lt;/li&gt;
&lt;li&gt;$N(x)$ : The adaptive weight for a point $x$&lt;/li&gt;
&lt;li&gt;$P(x)$ : Original feature map, in the range of [0,1]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 Auxiliary classification branch and loss function&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Output of the second I-A module&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;rarr; To reudce the risk of over-fitting&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q9awZ/btrtrq3WrEw/NK1sqtIQJk7KjZlllK71x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q9awZ/btrtrq3WrEw/NK1sqtIQJk7KjZlllK71x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q9awZ/btrtrq3WrEw/NK1sqtIQJk7KjZlllK71x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ9awZ%2Fbtrtrq3WrEw%2FNK1sqtIQJk7KjZlllK71x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;525&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Auxiliary classifier이 convergence를 가속할 뿐만아니라, test set에 대한 accuracy도 향상시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Loss function&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byYEOB/btrtk9W0jm0/VaVe5WOHFjmA21He39hpt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byYEOB/btrtk9W0jm0/VaVe5WOHFjmA21He39hpt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byYEOB/btrtk9W0jm0/VaVe5WOHFjmA21He39hpt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyYEOB%2Fbtrtk9W0jm0%2FVaVe5WOHFjmA21He39hpt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;213&quot; height=&quot;34&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$J$ : Loss function&lt;/li&gt;
&lt;li&gt;$J_0$ : Cross entropy of the final output of the model and the real label of the image&lt;/li&gt;
&lt;li&gt;$J_1$ : Cross entropy of the output of the model&amp;rsquo;s auxiliary classification branch and actual label&lt;/li&gt;
&lt;li&gt;$\alpha$ : Weight attenuation coefficient of the network&lt;/li&gt;
&lt;li&gt;$L$ : $L2$ regularization term (weight)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 The UW-Net Network&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q7LNk/btrtsGk9HzE/gfyENTEcKZFLiUJX6H5Pu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q7LNk/btrtsGk9HzE/gfyENTEcKZFLiUJX6H5Pu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q7LNk/btrtsGk9HzE/gfyENTEcKZFLiUJX6H5Pu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ7LNk%2FbtrtsGk9HzE%2FgfyENTEcKZFLiUJX6H5Pu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;348&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Table 1 기반 설계됨&lt;/li&gt;
&lt;li&gt;첫 번 째 I-A module에 들어가기전에 image의 size는 36x36으로 줄어듬&lt;/li&gt;
&lt;li&gt;두 convolution과 one pooling 함수에 의해서 input image channel은 32로 증가됨&lt;/li&gt;
&lt;li&gt;Final prediction of model은 Avgpool과 FC layer을 거친 후에 얻어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Experiments&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 Benchmark dataset&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Underwater images의 다양성을 보장하기 위해 ImageNet dataset, JAMSTEC dataset 그리고 online underwater images로부터 4000개 넘는 underwater images를 수집함&lt;/li&gt;
&lt;li&gt;Non-underwater images를 5000개 넘게 ImageNet으로부터 수집하여, non-underwater images라고 라벨링함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 Training and Analysis&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Training : Testing = 70% : 30%&lt;/li&gt;
&lt;li&gt;Augment the data by rnadom clipping and flipping&lt;/li&gt;
&lt;li&gt;&amp;rarr; to reduce the risk of over-fitting&lt;/li&gt;
&lt;li&gt;Initialization method proposed by He et al. (2015)&lt;/li&gt;
&lt;li&gt;SGD with mini-batch size of 32&lt;/li&gt;
&lt;li&gt;The weight decay rate : 0.001&lt;/li&gt;
&lt;li&gt;Momentum rate : 0.9&lt;/li&gt;
&lt;li&gt;Initial learning rate : 0.001
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The learning rate is decreaed ten times of its original value at 1k and 2k iterations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The training end at 3k interations&lt;/li&gt;
&lt;li&gt;The loss curve&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9shmX/btrtrrhsb0P/6u12oPZ0pfraFtJAo2E7dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9shmX/btrtrrhsb0P/6u12oPZ0pfraFtJAo2E7dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9shmX/btrtrrhsb0P/6u12oPZ0pfraFtJAo2E7dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9shmX%2Fbtrtrrhsb0P%2F6u12oPZ0pfraFtJAo2E7dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;355&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.3 Experimental results&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 모델과 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0WNbB/btrtlTs0uJB/pncsBGOSjXMdLdsMhc3kG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0WNbB/btrtlTs0uJB/pncsBGOSjXMdLdsMhc3kG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0WNbB/btrtlTs0uJB/pncsBGOSjXMdLdsMhc3kG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0WNbB%2FbtrtlTs0uJB%2FpncsBGOSjXMdLdsMhc3kG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;250&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Class activation maps (CAMs)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Ydpc/btrtqNE5fd4/ezwpdPoIrej1odLqdY2C01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Ydpc/btrtqNE5fd4/ezwpdPoIrej1odLqdY2C01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Ydpc/btrtqNE5fd4/ezwpdPoIrej1odLqdY2C01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Ydpc%2FbtrtqNE5fd4%2FezwpdPoIrej1odLqdY2C01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;831&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 어두은 붉은 색은 final classification에서 영역의 중요성을 더욱 나타내는것임&lt;/li&gt;
&lt;li&gt;UW-NET이 다른 모델들 보다 background에 더 집중함&lt;/li&gt;
&lt;li&gt;Table2 를 보면 성능이 좋은것을 확인가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.4 The Performance of the I-A Module&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I-A module은 다른 image classification networks에 사용 가능&lt;/li&gt;
&lt;li&gt;I-A의 일반적 능력을 증명하기 위해, Down sampling 시 maxpooling을 사용하는 제안한 I-A module을 다른 모델들에 embed시킴&lt;/li&gt;
&lt;li&gt;ILSVRC-2012 dataset : 100 categories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKT7U/btrtlsIHnp6/lGHa7zFK9fwfnMkgOKwkUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKT7U/btrtlsIHnp6/lGHa7zFK9fwfnMkgOKwkUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKT7U/btrtlsIHnp6/lGHa7zFK9fwfnMkgOKwkUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKT7U%2FbtrtlsIHnp6%2FlGHa7zFK9fwfnMkgOKwkUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;239&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Error rate가 줄어든것을 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Background의 특징을 잡아내기 위해 비교적 큰 convolutional kerenl을 Inception branch부분에서 사용했으며, Attention을 사용함&lt;/li&gt;
&lt;li&gt;Over-fitting을 줄이고자 Auxiliary classification branch 추가&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <category>attention</category>
      <category>background attention</category>
      <category>classification</category>
      <category>deeplearning</category>
      <category>image</category>
      <category>Inception</category>
      <category>underwaterimage</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/112</guid>
      <comments>https://luminitworld.tistory.com/112#entry112comment</comments>
      <pubDate>Tue, 15 Feb 2022 22:20:38 +0900</pubDate>
    </item>
    <item>
      <title>Multimodal Cross-And Self-Attention Network For Speech Emotion Recognition (2021 ICASSP) 논문</title>
      <link>https://luminitworld.tistory.com/111</link>
      <description>&lt;h1&gt;Abstract&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SER은 utterance의 언어적 요소와 어떻게 사람이 그것을 말하는지 둘 다에 대한 철저한 이해가 요구됨&lt;/li&gt;
&lt;li&gt;어떻게 이 두 가지의 정보를 융합할 지가 SER에서 중요한 과제 중 하나임&lt;/li&gt;
&lt;li&gt;새로운 Multimodal Cross- and Self-Attention Network (&lt;b&gt;MCSAN&lt;/b&gt;)을 제안함&lt;/li&gt;
&lt;li&gt;MCSAN의 핵심은 병렬적 cross와 self-attention module을 채용하는것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 모듈들은 audio와 text의 상호작용 속의 intra와 inter modal 둘 다에 대해 명백히 모델링 하기 위해서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MCSAN은 IEMOCAP와 MELD dataset으로 평가됨&lt;/li&gt;
&lt;li&gt;실험은 제안된 모델이 &lt;b&gt;두 datasets 모두에서 state-of-the-art 성능&lt;/b&gt;을 보인다는것을 증명함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분 SER의 최신 연구들은 acoustic 정보에만 집중함&lt;/li&gt;
&lt;li&gt;speech에 있는 textual 정보는 덜 사용됨&lt;/li&gt;
&lt;li&gt;일반적으로 multimodal 정보를 결합하는데 고려되어야 할 상호작용의 두 가지 종류가 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Intra-modal interactions&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;single modality안에서의 fine-grained feature interaction&lt;/li&gt;
&lt;li&gt;acoustic features안에서의 frame과 frame간의 관계&lt;/li&gt;
&lt;li&gt;textual features안에서의 word와 word간의 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;inter-modal interactions&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;text와 speech의 특징 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SER을 위한 acousitc과 text 정보를 결합하려는 최신 연구들을 크게 세 가지 타입으로 카테고리화 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) 각 modality에 대해 독립적인 모델들을 만들고 각 outputs를 마지막 emotion classification을 위해 결합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex [14]&lt;/li&gt;
&lt;li&gt;각 modality에 대해서 서로 다른 입력에 가장 적합하도록 다른 구조들이 채택될 수 있음&lt;/li&gt;
&lt;li&gt;intra-modal interactions가 잡힐 수 있으나, inter-modal interaction은 탐구되지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2) aligned audio and text를 input으로 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;aligned features는 처음에는 결합되고, 이 후 sequential 학습을 위해 시간에 종속된 model에 넣어짐&lt;/li&gt;
&lt;li&gt;그러므로 inter-modal interactions는 전체 과정에서 잡혀짐&lt;/li&gt;
&lt;li&gt;그럼에도 불구하고 정렬 정보를 제공하는데 비용이 듬&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3) audio와 text 사이의 잠재적 cross-modal relationships를 추론하는 attention 기법을 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;multi-hop 기법, 각 word에 대해 aligned speech frames를 학습하는 attention 기법 등&lt;/li&gt;
&lt;li&gt;하지만 그 누구도 명백하게 audio와 text의 intra-와 inter-modal interaction을 둘 다 모델링한 경우는 없었음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 문제를 해결하기 위해 MCSAN을 제안함&lt;/li&gt;
&lt;li&gt;cross-attention module과 2개의 self-attention modules가 사용됨&lt;/li&gt;
&lt;li&gt;cross-attention module은 cross-attention 기법을 사용하며, audio와 text 사이 정보를 전달하기 위해 사용함&lt;/li&gt;
&lt;li&gt;이러한 모델 덕분에 MCSAN은 audio와 text의 inter-과 intra-modal 상호작용을 명백히 모델링 가능&lt;/li&gt;
&lt;li&gt;MCSAN의 효율성을 증명하기 위해서 두 데이터셋 사용&lt;/li&gt;
&lt;li&gt;ablation 연구도 진행함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. The Proposed Model&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCSAN는 먼저 audio encoder과 text encoder을 각각 acoustic과 textual features를 encode할 용도로 사용&lt;/li&gt;
&lt;li&gt;encoded feature sequences는 cross-와 self-attention modules에 들어가서 audio와 text의 inter-과 intra-modal interaction을 학습함&lt;/li&gt;
&lt;li&gt;마지막으로 이 modules의 outputs는 concatenated되고 emotion prediction을 위한 fully connected classifier에 보내짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 Audio Encoder&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input acoustic feature sequence of utterance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHz0Bc/btrrF5O1VHe/nkX4SAXKnOfImpSxpXH1NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHz0Bc/btrrF5O1VHe/nkX4SAXKnOfImpSxpXH1NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHz0Bc/btrrF5O1VHe/nkX4SAXKnOfImpSxpXH1NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHz0Bc%2FbtrrF5O1VHe%2FnkX4SAXKnOfImpSxpXH1NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;37&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$T^{'}_{a}$ : acoustic frames의 수&lt;/li&gt;
&lt;li&gt;$d_a$ : feature dimension&lt;/li&gt;
&lt;li&gt;LSTM을 가진 CNN을 audio encoder로 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2개의 1D temporal(시간적) convolutional layers는 local pattern을 잡아내는데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$T^{'}_{a}$ 가 전형적으로 크기 때문에 각 convolution layer는 temporal resolution을 줄이고 subsequent learning을 이용하기 위해서 max-pooling layer을 후에 부착시켜 사용함&lt;/li&gt;
&lt;li&gt;그리고 나서 BiLSTM layer가 적용되고, 이 layer은 sequence내부에서의 temporal dependencies를 잡아냄&lt;/li&gt;
&lt;li&gt;BiLSTM의 forward와 backword의 hidden states은 encoded acoustic features를 얻기 위해서 평균으로 계산됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dx9gc6/btrrF7eXxQS/e3tUR808WZ8Lyffb0IZXq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dx9gc6/btrrF7eXxQS/e3tUR808WZ8Lyffb0IZXq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dx9gc6/btrrF7eXxQS/e3tUR808WZ8Lyffb0IZXq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdx9gc6%2FbtrrF7eXxQS%2Fe3tUR808WZ8Lyffb0IZXq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;185&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$T_a$ : 두 번째 pooling layer 이후의 acoustic frames의 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL3YNU/btrrI94pQEl/CkateQhFqI9my0Fwh6ZbwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL3YNU/btrrI94pQEl/CkateQhFqI9my0Fwh6ZbwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL3YNU/btrrI94pQEl/CkateQhFqI9my0Fwh6ZbwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL3YNU%2FbtrrI94pQEl%2FCkateQhFqI9my0Fwh6ZbwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;53&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 Text Encoder&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYwMp/btrrLN68Xat/rN4wQ5RXAcdEAFCzv5qb50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYwMp/btrrLN68Xat/rN4wQ5RXAcdEAFCzv5qb50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYwMp/btrrLN68Xat/rN4wQ5RXAcdEAFCzv5qb50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYwMp%2FbtrrLN68Xat%2FrN4wQ5RXAcdEAFCzv5qb50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;327&quot; height=&quot;33&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$T_l$ : words의 수&lt;/li&gt;
&lt;li&gt;$d_l$ : feature dimension&lt;/li&gt;
&lt;li&gt;주로 $T_l$의 수가 적다는것을 고려하여 오직 BiLSTM layer을 word-level textual features를 encode하는데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQlk2/btrrLL2yQPg/pRJ1fL1ek4wkTM6IfP1Gnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQlk2/btrrLL2yQPg/pRJ1fL1ek4wkTM6IfP1Gnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQlk2/btrrLL2yQPg/pRJ1fL1ek4wkTM6IfP1Gnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQlk2%2FbtrrLL2yQPg%2FpRJ1fL1ek4wkTM6IfP1Gnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;175&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3 Cross-Attention Module&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 모듈은 position embedding layer (Fig 1에서 간단하게 표현하려고 묘사안함) 과&lt;br /&gt;$N$개 만큼 쌓여진 cross-attention layers와 feed-forward layers로 구성되어 있음&lt;/li&gt;
&lt;li&gt;position embedding layer은 feature sequence에 temporal information을 주입하기 위해 사용됨&lt;/li&gt;
&lt;li&gt;두 개의 modalities 사이의 연관성을 학습하고 학습된 연관성에 따라 하나의 modality가 다른 modality에게 정보를 전파하려는 목적으로 cross-attention 기법을 사용하는 것이 이 module의 insight임&lt;/li&gt;
&lt;li&gt;audio와 text의 연관성을 학습하기 위해서, 먼저 각 feature sequence를 세 개의 관점인 query, key, value로 linear projection을 사용하여 변형시켜야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Bjj7/btrrJahXCs7/I2gRCvROoXO7pzoEGJ8Bw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Bjj7/btrrJahXCs7/I2gRCvROoXO7pzoEGJ8Bw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Bjj7/btrrJahXCs7/I2gRCvROoXO7pzoEGJ8Bw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Bjj7%2FbtrrJahXCs7%2FI2gRCvROoXO7pzoEGJ8Bw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;217&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;audio와 text의 query와 key의 dot products를 crossed way로 계산을 하여 두 modalities의 연관성을 추정함&lt;/li&gt;
&lt;li&gt;그리고 그 결과를 scaled시키고 softmax로 row-wisely normalized시켜서 attention weights를 얻음&lt;/li&gt;
&lt;li&gt;이 후 각 feature sequence의 value를 상응하는 attention weights를 사용하여 집계함&lt;/li&gt;
&lt;li&gt;위의 설명은 single-head attention이고 논문에서는 $N$개의 multi-head attention사용&lt;/li&gt;
&lt;li&gt;마지막으로 한 modality의 features를 다른 modality로 부터의 propagated information을 함께 넣어 update함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KsTwS/btrrD7T5i4w/u9H2AgyLjUJHJWFVVWYHMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KsTwS/btrrD7T5i4w/u9H2AgyLjUJHJWFVVWYHMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KsTwS/btrrD7T5i4w/u9H2AgyLjUJHJWFVVWYHMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKsTwS%2FbtrrD7T5i4w%2Fu9H2AgyLjUJHJWFVVWYHMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;80&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적으로 representation capacity를 더욱 증가시키기 위해서 fully connected feed-forward layer을 cross-attention layer 뒤에 추가함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0sSCL/btrrDxr0KPp/WmK6j8cbmYUJhv9tu11igk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0sSCL/btrrDxr0KPp/WmK6j8cbmYUJhv9tu11igk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0sSCL/btrrDxr0KPp/WmK6j8cbmYUJhv9tu11igk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0sSCL%2FbtrrDxr0KPp%2FWmK6j8cbmYUJhv9tu11igk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;143&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4 Self-Attention Module&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cross-attention module과 병렬적으로 배치하여 self-attention module을 놓아서 audio와 text안의 intra-modal interaction을 잡도록 목표를 둠&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YD5qw/btrrLMUHycf/oqIhmYKVOZzKFTkogjatd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YD5qw/btrrLMUHycf/oqIhmYKVOZzKFTkogjatd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YD5qw/btrrLMUHycf/oqIhmYKVOZzKFTkogjatd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYD5qw%2FbtrrLMUHycf%2FoqIhmYKVOZzKFTkogjatd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;211&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hz8TQ/btrrJaI1ncw/3xBNrcUx1XuvwD5GN7cnTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hz8TQ/btrrJaI1ncw/3xBNrcUx1XuvwD5GN7cnTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hz8TQ/btrrJaI1ncw/3xBNrcUx1XuvwD5GN7cnTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHz8TQ%2FbtrrJaI1ncw%2F3xBNrcUx1XuvwD5GN7cnTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;512&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 과정은 다음과 같음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.5 Classification&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막 classification을 하기 위해서, 먼저 각 cross- 와 self-attention으로 부터 나온 outputs를 global max-pooling layer을 사용하여 요약함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXPyU/btrrLLO1GHg/NT3pHbXWS5r8CmJJ7sQB50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXPyU/btrrLLO1GHg/NT3pHbXWS5r8CmJJ7sQB50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXPyU/btrrLLO1GHg/NT3pHbXWS5r8CmJJ7sQB50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXPyU%2FbtrrLLO1GHg%2FNT3pHbXWS5r8CmJJ7sQB50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;55&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;utterance-level representation을 얻기 위해서 그들을 concatenate 함&lt;/li&gt;
&lt;li&gt;마지막으로 fully-connected network와 softmax layer로 underlying emotion을 예측하도록 함&lt;/li&gt;
&lt;li&gt;cross-entropy loss를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDdDzo/btrrJaCf0xc/Fkll6oN52uw6vfLkNAV9d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDdDzo/btrrJaCf0xc/Fkll6oN52uw6vfLkNAV9d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDdDzo/btrrJaCf0xc/Fkll6oN52uw6vfLkNAV9d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDdDzo%2FbtrrJaCf0xc%2FFkll6oN52uw6vfLkNAV9d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;268&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;3. Experiments&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 Datasets&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IEMOCAP는 SER에서 가장 많이 사용되는 데이터&lt;/li&gt;
&lt;li&gt;총 7487 utterances from 7 emotions
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;frustration, neutral, anger, sadness, excitement, happiness, surprise&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;10-fold cross-validation (8:1:1 training, validation and test)&lt;/li&gt;
&lt;li&gt;WA, UA 평가 지표&lt;/li&gt;
&lt;li&gt;MELD는 새로운 multimodal dataset for emotion recognition in conversation&lt;/li&gt;
&lt;li&gt;13708 utterances with seven emotions : anger, disgust fear, joy, neutral, sadness, and surprise of 14333 dialogues from the classic TV-series Friends&lt;/li&gt;
&lt;li&gt;training (9989), validation (1109), test (2610)&lt;/li&gt;
&lt;li&gt;average F1 score 평가 지표&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 Implementation Details&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speech signals로 부터 40-dimensional MFCC 추출&lt;/li&gt;
&lt;li&gt;window size와 hop size는 25ms와 10ms로 각각 설정&lt;/li&gt;
&lt;li&gt;MFCC feature sequence의 max length는 1000으로 설정&lt;/li&gt;
&lt;li&gt;audio encoder로 들어가기 전에 z-normalization 진행함&lt;/li&gt;
&lt;li&gt;textual features에 대해서는 먼저 word-tokenizer을 적용&lt;/li&gt;
&lt;li&gt;그리고 나서 utterance의 각 word는 GloVe model을 사용하여 300-dimensional vector로 embedded 됨&lt;/li&gt;
&lt;li&gt;cross- 와 self-attention module안의 stacked layer의 수는 1개&lt;/li&gt;
&lt;li&gt;heads의 수는 8개&lt;/li&gt;
&lt;li&gt;audio encoder 안의 convolutional과 max-pooling layer의 kernel size는 3&lt;/li&gt;
&lt;li&gt;Adam Optimizer을 사용하고 learning rate는 IEMOCAP에서는 0.001 그리고 MELD에서는 0.0005를 사용&lt;/li&gt;
&lt;li&gt;batch size는 256&lt;/li&gt;
&lt;li&gt;IEMOCAP에서는 30 epochs, MELD에서는 20 epochs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 Baselines&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.4 Comparison to State-of-the-art Methods&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IEMOCAP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yt9uO/btrrEE4W4Nd/AbR88MoyRsCOptljC0i171/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yt9uO/btrrEE4W4Nd/AbR88MoyRsCOptljC0i171/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yt9uO/btrrEE4W4Nd/AbR88MoyRsCOptljC0i171/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyt9uO%2FbtrrEE4W4Nd%2FAbR88MoyRsCOptljC0i171%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;361&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCSAN이 baseline modesl보다 성능이 좋은것을 확인할 수 있음&lt;/li&gt;
&lt;li&gt;CAN는 aligned audio와 text가 input으로 필요하지만, cross-attention 기법의 장점으로 논문의 모델은 alignment information이 필요 없음&lt;/li&gt;
&lt;li&gt;AMH는 MHA의 tri-modal version으로 visual information을 MHA의 framework에 통합시킴&lt;/li&gt;
&lt;li&gt;MCSAN이 acoustic과 textual 정보만 사용했지만 AMH보다 더 좋은 성능을 냄&lt;/li&gt;
&lt;li&gt;MCSAN의 effectiveness를 더 증명하기 위해, MELD dataset에서도 평가함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kYXy2/btrrIfX58Cg/2MMLZ64DnWCpGZNdLIWulk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kYXy2/btrrIfX58Cg/2MMLZ64DnWCpGZNdLIWulk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kYXy2/btrrIfX58Cg/2MMLZ64DnWCpGZNdLIWulk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkYXy2%2FbtrrIfX58Cg%2F2MMLZ64DnWCpGZNdLIWulk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;241&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게다가 논문의 모델은 많은 양의 unlabeled data를 사용하여 만든 semi-supervised model보다 성능이 더 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.5 Ablation study&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논문에서 제안한 모델안의 몇몇 key factors를 평가하기 위해서 IEMOCAP dataset으로 몇몇 실험을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciLPYb/btrrJGnaWuS/MKnvrtYL2Ah0rV1ZQi0F71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciLPYb/btrrJGnaWuS/MKnvrtYL2Ah0rV1ZQi0F71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciLPYb/btrrJGnaWuS/MKnvrtYL2Ah0rV1ZQi0F71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciLPYb%2FbtrrJGnaWuS%2FMKnvrtYL2Ah0rV1ZQi0F71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;394&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input으로 오직 acoustic 혹은 textual information만 사용한 경우 성능이 떨어지는 것을 확인할 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이것은 두 종류의 정보를 효율적으로 fuse를 SER system에서 하는것이 중요하다는것을 제안함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;attention modules의 효과를 평가함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;self- 혹은 cross- attention module이 제거된다면, 성능이 감소한것을 확인할 수 있음&lt;/li&gt;
&lt;li&gt;inter-과 intra-modal interactions 둘 다에 대한 명백한 모델링이 필요하다는 것을 증명함&lt;/li&gt;
&lt;li&gt;cross-attenion module의 유무도 마찬가지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델 구조적 실험
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;attention module을 병렬적으로 배치하는 대신, sequential방식을 서로 다른 순서로 조합함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 cross+self 혹은 self+cross 조합 그 어느것도 parallel 구조보다 좋지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마지막으로 model의 capacity에 대해 평가함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;self- 와 cross-attention modules 안에 더 많은 layers를 쌓으면 성능이 더 떨어진다는것을 발견함&lt;/li&gt;
&lt;li&gt;이것은 아마 large models를 충분하게 학습하기엔 데이터이 수가 너무 작기 때문에 overfitting이 발생했다고 생각함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. Conclusion&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Speech emotion recognition을 위한 MCSAN을 제안했고, cross-와 self-attention을 병렬적으로 놓음으로써 좋은 성능을 냈음&lt;/li&gt;
&lt;li&gt;미래에 tri-modal version으로 확장할 계획이 있음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <category>attention</category>
      <category>deeplearning</category>
      <category>emotion recognition</category>
      <category>ICASSP</category>
      <category>Multi modal</category>
      <category>Speech</category>
      <category>text</category>
      <category>논문정리</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/111</guid>
      <comments>https://luminitworld.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 25 Jan 2022 20:28:54 +0900</pubDate>
    </item>
    <item>
      <title>Multimodal Emotion Recognition With High-Level Speech And Text Features 논문</title>
      <link>https://luminitworld.tistory.com/108</link>
      <description>&lt;h1&gt;Abstract&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 연구들은 emotion recognition task를 해결하기 위해 low-level data representations로 deep learning models를 학습함&lt;/li&gt;
&lt;li&gt;emotion datasets가 빈번히 data양에 한계를 가지고 이러한 접근들은 overfitting으로 고통받을 수 있으며, 깊이 없는 단서들 기반으로 학습될 것임&lt;/li&gt;
&lt;li&gt;이러한 문제를 해결하기 위해서,&lt;br /&gt;disentanglement representation learning으로 부터 영감을 받은&lt;br /&gt;새로운 cross-representation speech 모델을 제안함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;wav2vec 2.0 speech features로 emotion recognition을 수행함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transformer-based models에서 추출된 text feature로 부터 감정을 인식하기위한 CNN-based model을 학습시킴&lt;/li&gt;
&lt;li&gt;더 나아가 speech-based와 text-based 결과를 score fusion 접근 방식을 가지고 합침&lt;/li&gt;
&lt;li&gt;IEMOCAP dataset 의 4-class classfication 문제로 평가됨&lt;/li&gt;
&lt;li&gt;speech-only, text-only, multimodal emotion recogntion의 분야에서 최신 연구 성능을 초월함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. Introduction&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 연구들이 emotion recognition 방식을 준언어(비언어적) features 혹은 수정된(transcribed) text data로 부터 제안함&lt;/li&gt;
&lt;li&gt;하지만 준언어에 반영한다면 언어적 소통 의미는 바뀔것이고 반대도 마찬가지임&lt;/li&gt;
&lt;li&gt;그러므로 spoken text는 speech 억양에 따라 다르게 해석될 것임&lt;/li&gt;
&lt;li&gt;emotion recognition에서 가장 근본적 도전과제 중 하나는 data안에서 emotion 단서들을 잡아내는것&lt;/li&gt;
&lt;li&gt;대부분 최신 연구들이 데이터로부터 이러한 feature sets를 추출하기 위해 deep learning training을 제안했고,&lt;br /&gt;만족스러운 결과를 야기했지만 두 가지 문제들이 존재함
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 모델들이 주로 low-level data representations을 사용하여 밑바닥부터 학습되기 때문에 overfitting을 쉽게 초래할 수 있음&lt;/li&gt;
&lt;li&gt;deep learning 구조들은 얕은 단서들로 부터 학습된다고 알려져있는데 여기서 최신 모델들이 정말로 데이터로부터 emotion 정보를 잡아내는지 아닌지에 대한 의문점&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;위의 문제들을 다루기 위해
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speech-based와 text-based emotion recognition 연구들에서 흔하게 사용되는 low-level data representations에 도전하고(이의를 제기하고),&lt;/li&gt;
&lt;li&gt;논문의 방식에 high-level-features를 포함함으로써 해결하고자 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;low-level : feature engineering에서 얻은 features&lt;/li&gt;
&lt;li&gt;high-level : deep learning 접근으로부터 추출된 generic features&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;speech emotion recognition을 위한 &lt;code&gt;cross-representation model&lt;/code&gt;을 제안함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;high-level&lt;/b&gt; wav2vec 2.0 것들로 부터 &lt;b&gt;low-level mel-spectrogram&lt;/b&gt; speech representations를 재구성하는데 목표를 잡기 위함임&lt;/li&gt;
&lt;li&gt;&amp;rarr; 두 표현들 모두 활용하게 됨&lt;/li&gt;
&lt;li&gt;wav2vec를 선택한 이유는 풍부한 운율적 정보를 포함하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;speech로 부터 포괄적인 감정 표현을 잡아내기 위해 disentanglement representations learning 기술들을 데이터 안 speaker의 identity와 음성 변이(phonentic variations)를 제거하는데 사용&lt;/li&gt;
&lt;li&gt;Transformer-based models에서 추출된 text feature로 부터 감정을 인식하기위한 CNN-based model을 학습시킴&lt;/li&gt;
&lt;li&gt;Transformed-based models에서 얻은 features들이 흔하게 사용되는 word2vec과 GloVe features보다 더 낫다고 판단
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;판단 이유는 문장에서 긴 문맥적 정보를 modelling하는 Transformer의 능력 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종적으로 multimodal emotion recognition 결과를 얻기 위해 speech-based와 text-based 결과를 합침&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. Related Works&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 Wav2vec 2.0&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;self-supervision을 통한 speech representations를 얻기위한 framework&lt;/li&gt;
&lt;li&gt;wav2vec model은 많은 양의 unlabelled speech data로 학습되고 나서 ASR를 위한 labelled data로 fine-tuned됨&lt;/li&gt;
&lt;li&gt;Wav2vec은 feature encoder과 context network로 구성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Encoder
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input으로 raw waveform을 받음&lt;/li&gt;
&lt;li&gt;20ms의 stride와 25ms의 receptive field를 이용하여 features의 sequence를 ouputs로 출력함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;receptive field : 수용영역
수용영역이란 외부 자극이 전체 영향을 끼치는 것이 아니라 특정 영역에만 영향을 준다는 뜻
convolution filter 부분과 같은듯&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 features는 speech의 위치 정보를 encode하고 wav2vec의 &amp;lsquo;base&amp;rsquo;와 &amp;lsquo;large&amp;rsquo; 버전에 대해 각각 768과 1024의 크기를 가짐&lt;/li&gt;
&lt;li&gt;이 후 feature sequence는 Transformed-based context network로 입력됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lsquo;base&amp;rsquo; wav2vec : 12 Transformer blocks&lt;/li&gt;
&lt;li&gt;&amp;lsquo;large&amp;rsquo; wave2vec : 24 Transformer blocks&lt;/li&gt;
&lt;li&gt;Transformed-based context network는 speech의 contextualized representation을 출력함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;wav2vec 2.0이 원래 ASR에 적용하기위해 학습된 representations임에도 불구하고,&lt;br /&gt;speech emotion recognition과 같은 다른 과제에서도 이 representations로 부터 이득을 볼 수 있음(유용하게 사용될 수 있다는 뜻)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 Speech Emotion&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SER(Speech emotion Recognitino) 문제 특성은 speech로부터 emotion을 나타내는 적절한 특징을 정의하는것&lt;/li&gt;
&lt;li&gt;이전 연구들에서는 emotion 정보를 MFCC, pitch 그리고 energy로 부터 추출해서 찾으려고 함&lt;/li&gt;
&lt;li&gt;최신 연구에서는 pre-trained된 wav2vec 2.0 model에서의 local과 상황별(contextualized) outputs를 합치는 학습 가능한 가중치들을 이용하여 가중합을 이용하는것이 더 나은 SER 결과를 나타낸다고 보여짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3 Text Emotion Recognition&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 TER(Text Emotion Recognition) 연구에서는 밑바닥부터 학습된 ASR model의 features를 사용하거나 혹은 Word2Vec 혹은 GloVe features를 사용함&lt;/li&gt;
&lt;li&gt;위의 방식도 좋은 결과를 나타내지만, NLP 과제에서 Transformers 기반 모델들이 월등한 성능을 보여주면서 기존 방식에 대한 의문을 가지는 것은 당연함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4 Disentanglement Representation Learning&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 learning은 데이터안에서 근본적인 변화(variation) 요인들을 분리시키는것을 목표로 둠&lt;/li&gt;
&lt;li&gt;이러한 요인들을 분리시킴으로써 해결하고 싶은 과제에 대해서 관련성이 있는 요인들을 유지하면서 유용하지 않는 요인들을 버릴 수 있음&lt;/li&gt;
&lt;li&gt;Disentanglement는 image, video, speech applications에서 적용되어 왔음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speech 관련 연구에서는 주로 speech conversation과 prosody transfer 연구들에서 적용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AutoVC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speech conversation에서 speech content의 speaker-independent representation을 추출하는 autoencoder&lt;/li&gt;
&lt;li&gt;(speaker가 누구인지 신경쓰지 않고 추출한다는 것인듯)&lt;/li&gt;
&lt;li&gt;Mel-spectrogram은 모델의 encoder에 input으로 들어감&lt;/li&gt;
&lt;li&gt;decoder은 encoder의 ouputs로부터 spectrogram과 speaker identity embedding을 재구성(복원) 함&lt;/li&gt;
&lt;li&gt;encoder의 bottleneck size를 조절함으로써, speaker identity 정보는 encoder의 bottleneck에서 제거됨&lt;/li&gt;
&lt;li&gt;Speech-Flow는 AutoVC를 기반으로 speech를 pitch, rhythm 그리고 content featurs로 분리함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;관련 다른 연구에서 i-vectors와 x-vectors로 부터 speech style과 speaker identity를 disentangle하기 위한 autoencoder을 제안했고 그들은 speech style embedding을 SER에 사용했음&lt;/li&gt;
&lt;li&gt;또 다른 관련 연구에서는 adversarial training을 사용하여 speech features를 speaker identity와 emotion features로 분리함&lt;/li&gt;
&lt;li&gt;이런 방식들은 논문에서 제안된 방식과 비슷한점이 있지만 차이점은 이전 연구들과 다르게 emotion features를 얻기 위해서 &lt;b&gt;speaker identity 정보&lt;/b&gt;를 &lt;b&gt;완벽하게 제거한다는 점&lt;/b&gt;과&lt;br /&gt;experiments를 이러한 features의 disentanglement 속성에 대한 실험을 수행한다는 점임&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. Methodology&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SER model&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input으로 wav2vec features와 melspectrogram, speaker identity embeddings 그리고 phone sequence로 받음&lt;/li&gt;
&lt;li&gt;이 모든 features는 &lt;b&gt;같은 speech&lt;/b&gt; segment로 부터 추출됨&lt;/li&gt;
&lt;li&gt;모델은 speech segment에 대한 각 emotion class의 확률을 출력함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TER Model&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;말을 글로 옮긴 기록으로부터 추출된 text featurs를 input으로 받음&lt;/li&gt;
&lt;li&gt;말에 대한 각 emotion class의 확률을 출력함&lt;/li&gt;
&lt;li&gt;SER과 TER 결과는 multimodal emotion class 확률을 얻기 위해 점수 융합을 통해 결합됨&lt;/li&gt;
&lt;li&gt;SER, TER model 그리고 fusion 접근에 대한 그림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO2kSH/btrqN3pZcuq/WlyJNj7aLUMYdMyokRk6P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO2kSH/btrqN3pZcuq/WlyJNj7aLUMYdMyokRk6P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO2kSH/btrqN3pZcuq/WlyJNj7aLUMYdMyokRk6P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO2kSH%2FbtrqN3pZcuq%2FWlyJNj7aLUMYdMyokRk6P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1065&quot; height=&quot;737&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 Speech Emotion Recognition&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;wav2vec 2.0 features를 input으로 받고 대응하는 melfrequency spectrogram을 재구축하는&lt;br /&gt;encoder-decoder model을 제안함&lt;/li&gt;
&lt;li&gt;모델은 4개의 주요 요소로 구성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;encoder&lt;/li&gt;
&lt;li&gt;decoder&lt;/li&gt;
&lt;li&gt;phone encoder&lt;/li&gt;
&lt;li&gt;classifier&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델은 약 2초 길이 정도되는 96frames의 speech segments으로 학습됨&lt;/li&gt;
&lt;li&gt;이러한 segments는 training과정 동안 speech utterances로부터 무작위로 잘라짐&lt;/li&gt;
&lt;li&gt;논문의 SER model은 AutoVC와 비슷함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 세 가지 부분이 다름
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) wav2vec features는 모델의 encoder에 acoustic한 input을 넣게 됨 ( wav2vec input에 acoustic한것을 넣어서 그런듯)&lt;/li&gt;
&lt;li&gt;2) emotion classfier와 해당 논문 방식의 emotion loss를 포함시킴&lt;/li&gt;
&lt;li&gt;3) decoder에 입력이 될 outputs를 가진 phone encoder을 정의함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.1 Wav2vec 2.0 Feature Extraction&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LibriVox dataset에 있는 60k hours의 unlabelled speech data로 pretrained된 &amp;ldquo;large&amp;rdquo; wav2vec 2.0 model로 부터 wav2vec features를 추출함&lt;/li&gt;
&lt;li&gt;feature encoder의 ouput과&lt;br /&gt;context layers안에 있는 모든 24개의 Transformer layers의 ouput으로 부터&lt;br /&gt;features을 얻음&lt;/li&gt;
&lt;li&gt;그러므로 각 speech frame마다 1024-dimensional wav2vec features가 25개가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.2 Speaker Identity Feature Extraction&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LibriSpeech, VoxCeleb1 그리고 VoxCeleb2에서 pretrained 된 Resemblyzer을 사용하여 speaker identity features를 추출함&lt;/li&gt;
&lt;li&gt;각 utterance(말) 마다 speaker identity를 표현하는데 256-dimensional embedding이 얻어짐&lt;/li&gt;
&lt;li&gt;각 speaker(화자)마다 랜덤하게 선택된 100개 말들로부터 speaker identity features를 추출하고 그것들의 평균을 speaker을 표현하는 최종 identity embedding으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.3 Encoder&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwKExK/btrqN4h7HU8/DAEcBZaTTBeOrOuDgYnta1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwKExK/btrqN4h7HU8/DAEcBZaTTBeOrOuDgYnta1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwKExK/btrqN4h7HU8/DAEcBZaTTBeOrOuDgYnta1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwKExK%2FbtrqN4h7HU8%2FDAEcBZaTTBeOrOuDgYnta1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;181&quot; height=&quot;68&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$h_{avg}$ : weighted average&lt;/li&gt;
&lt;li&gt;$\alpha$ : trainable weights&lt;/li&gt;
&lt;li&gt;$h_i$ : wav2vec 2.0 features ( 25개 )&lt;/li&gt;
&lt;li&gt;$h_{avg}$는 256-dimensional speaker identity embedding과 frame 대 frame 마다 concatenated됨&lt;/li&gt;
&lt;li&gt;encoder안의 BLSTM layers는 $d$ 뉴런들을 가지고 ouput은 $[2d, 96]$의 크기를 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;layers의 ouput을 forward와 backward 방향들 모두로 concatenate했기 때문에 위와 같은 크기 가짐&lt;/li&gt;
&lt;li&gt;$d$는 bottleneck의 크기를 결정하고 channel dimension의 features의 크기가 감소시키는 역할을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;downsampler operation은 각 speech frame마다 $2d$ size arrry를 input으로 받고 모든 $f$ frames 마다 취해진 arrays를 출력함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 해당 operation은 downsampling factor $f$에 의해 feature arry의 시간(temporal) dimension을 줄임&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;encoder은 $[2d, 96/f]$의 크기를 가진 feature array를 출력하고 결과적으로 $d$와 $f$가 bottleneck dimension을 통제함&lt;/li&gt;
&lt;li&gt;bottleneck의 크기를 통제함으로써 speaker identity 또는 phonetic 정보가 포함되지 않고 emotion 정보를 포함하는 disentangled speech representations를 얻고 싶어함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.4 Decoder&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;decoder에서는 temporal dimension의 각 feature를 $f$번 반복시킴으로써 encoder의 features가 upsampled 됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;upsample시켰기 때문에 downsampling operation하기 전과 같은 크기가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;encoder의 features가 오직 emotion information만 포함하고 있기 때문에&lt;br /&gt;decoder은 encoder의 output뿐만 아니라 speaker identity embeddings와 phone sequence embeddings를 input으로 사용하여 spectrogram을 재구축할 수 있도록 함&lt;/li&gt;
&lt;li&gt;decoder의 linear layer로부터의 output은 각 speech frame에 대해 80의 크기를 가진 feature array임
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 ouput은 speech segment의 mel-spectrogram을 나타냄&lt;/li&gt;
&lt;li&gt;이 ouput features는 &lt;code&gt;reconstruction loss&lt;/code&gt; $L_{r1}$의 평균들에 의해 원본 mel-spectrogram과 비교됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$L_{r1}$은 모든 모델의 parameters를 update하는데 사용되는 놈임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한 decoder의 말단 output과 위와 같은 원본 mel-spectrogram 사이를 &lt;code&gt;reconstruction loss&lt;/code&gt; $L_{r2}$ 로 계산함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JtvAD/btrqNMhG78o/NjIE2Xd8RxnGK3dGkzrxgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JtvAD/btrqNMhG78o/NjIE2Xd8RxnGK3dGkzrxgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JtvAD/btrqNMhG78o/NjIE2Xd8RxnGK3dGkzrxgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJtvAD%2FbtrqNMhG78o%2FNjIE2Xd8RxnGK3dGkzrxgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;73&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 해당 식은 $L_{r1}$과 $L_{r2}$ 모두 적용되는 식 )&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$M$ : training batch size&lt;/li&gt;
&lt;li&gt;$x_k$ : model에 의해 출력된 batch안의 $k$번째 feature element&lt;/li&gt;
&lt;li&gt;$y_k$ : $x_k$에 대한 원본 정답 (ground-truth)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.5 Phone Encoder (phone : 음)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;phone encoder은 phone embeddings의 sequence를 input으로 받음&lt;/li&gt;
&lt;li&gt;output은 전체 phone sequence에 대한 표현을 나타냄&lt;/li&gt;
&lt;li&gt;phone embedding을 얻기 위한 2-step
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(1) 각 utterance마다 Gentle aligner를 사용하여&lt;br /&gt;speech signal과 해당 신호에 상응하는 text transcript로부터&lt;br /&gt;phone alignment 정보를 추출함&lt;/li&gt;
&lt;li&gt;(2) 각 frame 마다 가장 긴 phone을 결정함으로써 phone alignment 정보로부터 phone sequence를 얻음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 phone에게 id 번호를 부여함&lt;/li&gt;
&lt;li&gt;not-identified된 phones인 silence와&lt;br /&gt;dataset안의 각 special token에게도 ids를 할당함&lt;br /&gt;(e.g. [LAUGHTER] : 웃음소리에 대한 token)&lt;/li&gt;
&lt;li&gt;one-hot embedding방식으로 128개의 구분된 phone ids로 구성됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.6 Classifier&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Classifier은 encoder의 output이 emotion의 정보를 포함할 수 있도록 유도함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emotion label&lt;/code&gt; &lt;b&gt;$c$&lt;/b&gt; 와 classifier에 의해 출력되는 &lt;code&gt;logits&lt;/code&gt; $z$의 softmax 사이를&lt;br /&gt;cross-entropy loss $L_e$로 다음과 같이 계산함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zuieh/btrqLXYTkzo/tSmjKLdoKRN5PxC2UuA3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zuieh/btrqLXYTkzo/tSmjKLdoKRN5PxC2UuA3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zuieh/btrqLXYTkzo/tSmjKLdoKRN5PxC2UuA3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzuieh%2FbtrqLXYTkzo%2FtSmjKLdoKRN5PxC2UuA3K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;108&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1.7 Training and inference&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Training과정에서 최소화 되어질 목표 함수는 $L_{r1},L_{r2}$ 와 $L_e$ 사이의 합&lt;/li&gt;
&lt;li&gt;inference 과정에서는 emotion class 확률들을 얻기 위해서&lt;br /&gt;softmax 함수가 model이 ouputted 한 emotion class logits array에 적용됨&lt;/li&gt;
&lt;li&gt;가장 높은 확률 값을 가진 class가 final classification 결과로 선택됨&lt;/li&gt;
&lt;li&gt;모델은 96frame의 speech segment로부터의 features를 input으로 받음&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;utterance-level prediction을 얻기 위해서,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 (overlap 없이) utterance에서 모든 96개의 연속적인 frames 마다 emotion class 확률들을 계산함 ( 필요에 따라 zero padding 함)&lt;/li&gt;
&lt;li&gt;이러한 segment-level의 확률들의 평균을 최종 utterance-level의 확률로 정함&lt;/li&gt;
&lt;li&gt;( 평균을 취했다고 하는것을 보면 segment각각을 classification 값 내고 이를 평균을 취한것 같음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 Text Emotion Recognition&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[35]는 TER 과제가 emotion classification을 수행하기 전 모든 text tokens의 embeddings를 수행하는것(processing)으로부터 이득을 얻을 수 있다는것을 보여줌&lt;/li&gt;
&lt;li&gt;이러한 결과를 참고하여, Transformer-based models에서 추출된 an untterance안의 모든 token의 embeddings를 수행하는(process) CNN-based model을 제안함&lt;/li&gt;
&lt;li&gt;pre-trained Transformer-based models를 이용하여 각 utterance에 대해 shape가 $[U,L]$ 인 text representation을 추출함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$N$ : special tokens을 제외한 utterance의 tokens의 수&lt;/li&gt;
&lt;li&gt;$L$ : 각 token의 feature의 size&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;text representation을 zero-pad하였고 그 결과 TER model의 input은 $[N^{'}, L]$의 크기를 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$N^{'}$ : dataset의 an utterance에서 발견되는 최대 tokens 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 text features가 TER model에 processed 되고 cross-entropy loss로 학습이 됨&lt;/li&gt;
&lt;li&gt;inference하는 동안 SER model과 유사하게 emotion classification을 얻기위해서 softmax 함수는 TER model의 logits array에 적용됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 SER model과 달리, TER model의 ouput은 utterance-level emotion classification result를 나타냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 Multimodal Emotion Recognition&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 utterance에 대한 speech-based utterance-level 확률들 $p_s$와 text model로 부터 출력되는 확률들 $p_t$는 다음과 같이 결합됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LpSKf/btrqNfj7z8Z/sEXUVZCI92V9BD6utinAo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LpSKf/btrqNfj7z8Z/sEXUVZCI92V9BD6utinAo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LpSKf/btrqNfj7z8Z/sEXUVZCI92V9BD6utinAo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpSKf%2FbtrqNfj7z8Z%2FsEXUVZCI92V9BD6utinAo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;35&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$p_f$ : fused probability&lt;/li&gt;
&lt;li&gt;$w_1$ : speech modalities에 할당된 fixed weights&lt;/li&gt;
&lt;li&gt;$w_2$ : text modalities에 할당된 fixed weights
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;weigths들은 fused probability에 대해서 각 data modality의 기여 정도를 결정함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;an utterance에 대한 emotion classification의 결과는 가장 높은 fused probability를 가진 emotion class에 상응함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. Dataset&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IEMOCAP dataset 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dataset에 10명의 배우들이 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그들의 대화들은 5 dyadic sessions로 구성되어 있음&lt;/li&gt;
&lt;li&gt;각 dyadic은 남자와 여자 배우들의 서로다른 짝으로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dataset은 대략 12시간의 audiovisual data며, 이들은 speech(혹은 utterances)로 segmented 됨&lt;/li&gt;
&lt;li&gt;각 utterance는 3명의 주석자에 의해 labelled 됨&lt;/li&gt;
&lt;li&gt;최소 두명의 주석자가 같은 label을 취한 utterances에 대해서만 이용을 함&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Happy&amp;rdquo; 와 &amp;ldquo;Excited&amp;rdquo; category의 utterances를 &amp;ldquo;Happy&amp;rdquo;로 통일하여 labelling 함&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Angry&amp;rdquo;, &amp;ldquo;Neutral&amp;rdquo;, &amp;ldquo;sad&amp;rdquo; 그리고 &amp;ldquo;Happy&amp;rdquo;에 대한 labels를 가진 utterances만을 선택했고 결과적으로 대략 7시간의 데이터인 5531 utterances&lt;/li&gt;
&lt;li&gt;오직 speech data, transcripts 그리고 labels만 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;5. Training Configuration&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;leave-one-sesion-out cross-validation&lt;/code&gt;을 모든 experiments에서 수행함&lt;/li&gt;
&lt;li&gt;WA와 UA의 관점에서 결과들을 보고함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WA : 모든 emotion class를 반영한 average recall&lt;/li&gt;
&lt;li&gt;UA : 올바르게 분류한 sample의 비율&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 models는 Pytorch로 만듬&lt;/li&gt;
&lt;li&gt;모든 training experiment마다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Adam optimizer&lt;/li&gt;
&lt;li&gt;with learning rate : $10^{-4}$&lt;/li&gt;
&lt;li&gt;with the default exponential decay rate of the moment estimates&lt;/li&gt;
&lt;li&gt;(순간 변화의 기본적 지수적 감소 : 미분 순간 변화율로 decay rate 사용한듯)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SER models는
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;batch size : 2&lt;/li&gt;
&lt;li&gt;iteration : 1 million&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TER models는
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;batch size : 4&lt;/li&gt;
&lt;li&gt;iteration : 412,800&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;6. SPeech Emotion Recognition&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.1 Emotion Recognition Experiments&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;encoder에 두 개의 bottleneck configurations를 수행하고 각각 down-sampling factor을 다르게 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;Small&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$d$ : 8&lt;/li&gt;
&lt;li&gt;$f$ : 48&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Large&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$d$ : 128&lt;/li&gt;
&lt;li&gt;$f$ : 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;utterance-level SER 결과는 Table 1과 같음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biXP35/btrqNgi0wLl/yTecqcxct1vmImh4zDmQUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biXP35/btrqNgi0wLl/yTecqcxct1vmImh4zDmQUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biXP35/btrqNgi0wLl/yTecqcxct1vmImh4zDmQUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiXP35%2FbtrqNgi0wLl%2FyTecqcxct1vmImh4zDmQUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;208&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SER task에 대해서 &amp;ldquo;Large&amp;rdquo; model과 비교했을 때 &amp;ldquo;Small&amp;rdquo; 배치가 더 좋은 성능을 보임&lt;/li&gt;
&lt;li&gt;Table2는 &amp;ldquo;Small&amp;rdquo; model에서 얻어진 결과들을 최신 state-of-the-art와 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jl9Ix/btrqMR4SlWp/LVP1bdYJueryTB9Z7RH67K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jl9Ix/btrqMR4SlWp/LVP1bdYJueryTB9Z7RH67K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jl9Ix/btrqMR4SlWp/LVP1bdYJueryTB9Z7RH67K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJl9Ix%2FbtrqMR4SlWp%2FLVP1bdYJueryTB9Z7RH67K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;345&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가로 wav2vec embeddings를 입력으로 넣는것이 SER에게 좋은 성능에 도움이 되는지(advantageous)에 대한 평가를 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;Small&amp;rdquo; 형태와 같은 parameters로 학습을 하는데 input을 wav2vec features가 아닌 a mel-spectrogram을 대신 사용했음&lt;/li&gt;
&lt;li&gt;그 결과 absolute accuracy 관점에서 5-fold cross-validation에 대한 UA가 50.4%로&lt;br /&gt;input을 wav2vec embeddings로 했을 때 보다 19.7%더 안좋게 나옴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 그러므로 전통적인 mel-frequency spectrograms와 비교할 때, wav2vec embeddings의 learned weighted 평균이 IEMOCAP dataset을 사용한 SER에 대해서 더 나은 representation을 보여준다는 결론을 내릴 수 있음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.2 Disentanglement Experiments&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speaker identification task를 해결하기 위해서 얻어진 speech representations에 4-linear layer classifiers를 학습시킴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4-linear layer classifiers
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input에서 ouput방향으로 2048, 1024, 1024, 8 nuerons를 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저자들의 목표는 얻어진 emotion features가 speaker identity 정보를 가지고 있는지 아닌지에 대해서 보는것임&lt;/li&gt;
&lt;li&gt;이상적으로 저자들이 원하는 것은 features가&lt;br /&gt;speaker-independent하고, 어떤 speakers이든간에 사용될 수 있는 포괄적인 emotion representation을 담고 있는것임&lt;/li&gt;
&lt;li&gt;5-fold cross-validation 방식으로 classifiers를 학습시켰고 이번 experiment에서는 folds를 다르게 정의함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랜덤하게 분리시켜서, 각 speaker의 data의 80%는 training과정에 사용하고 나머지 20%는 test과정에 사용&lt;/li&gt;
&lt;li&gt;해당 folds들은 speaker dependent한 train과 test sets를 가지고 있고,&lt;br /&gt;그들의 각각은 오직 4 sessions의 data를 포함하고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;classifiers를 cross-entropy loss로 학습시킴&lt;/li&gt;
&lt;li&gt;Table3는 speaker identity recognition results를 요약함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDpy7n/btrqLTh6ye6/P4vFJjRqCI9Qa2FyKzQm11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDpy7n/btrqLTh6ye6/P4vFJjRqCI9Qa2FyKzQm11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDpy7n/btrqLTh6ye6/P4vFJjRqCI9Qa2FyKzQm11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDpy7n%2FbtrqLTh6ye6%2FP4vFJjRqCI9Qa2FyKzQm11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;220&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Table3이 suggests하는 것은 &amp;ldquo;Large&amp;rdquo; model로 추출된 features는 &amp;ldquo;Small&amp;rdquo; model로 추출된 것 보다 speaker identity에 대한 정보가 더 많이 포함하고 있다는 것임&lt;/li&gt;
&lt;li&gt;Table3과 Table1의 결과를 전체적으로 볼 때, &amp;ldquo;Large&amp;rdquo; model과 비교했을 때, &amp;ldquo;Small&amp;rdquo; model로 부터 추출된 features가 더 나은 SER accuracy를 가지고 worse한 speaker identity accuracy를 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이러한 결과는 bottleneck size가 speech에서 disentanglement의 factors로 결정될 수 있다고 말함 (which makes the SER task easier)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.3 Discussion&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저자들은 그들의 SER model이 3가지 요소들 때문에 이전의 방식들과 비교했을 때 더 나은 결과를 얻을 수 있다고 말함.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) 자신들의 model에 high-level speech representations를 input으로 사용했다는 점&lt;/li&gt;
&lt;li&gt;2) section 6.2에서 보여졌듯이 features가 certain level of disentanglement를 가지고도록 만드는 모델에 의해 얻어진 features에서 encoded된 정보를 분석하는데 사려깊게 했다는 점&lt;/li&gt;
&lt;li&gt;3) wav2vec features로부터 spectrograms를 재구성되도록 학습시켰기 때문에 high-level과 low-level features 둘 다 활용할 수 있다는 점&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;7. Text Emotion Recognition&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 다른 Transformer-based models로부터 추출된 input features를 이용하여 TER model을 학습시킴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Transformer-based-models 모두 &amp;ldquo;large&amp;rdquo; version으로 사용했고 이들은 각 token에 대해서 1024-dimensional feature을 출력함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TER 결과는 Table4에서 서로 다른 feature extractors에 대해서 보여짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/33lkc/btrqNfEtJG2/QjDJTaqvL1Gz5MOZf1QLw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/33lkc/btrqNfEtJG2/QjDJTaqvL1Gz5MOZf1QLw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/33lkc/btrqNfEtJG2/QjDJTaqvL1Gz5MOZf1QLw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F33lkc%2FbtrqNfEtJG2%2FQjDJTaqvL1Gz5MOZf1QLw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;369&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Table5에서 제일 잘 나온 결과를 최신 state-of-art와 비교함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPffo/btrqJ7nwzxY/fnyrZVgfPjGwoam5GsW1XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPffo/btrqJ7nwzxY/fnyrZVgfPjGwoam5GsW1XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPffo/btrqJ7nwzxY/fnyrZVgfPjGwoam5GsW1XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPffo%2FbtrqJ7nwzxY%2FfnyrZVgfPjGwoam5GsW1XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;286&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;context information을 사용한 [40]을 제외하고 논문의 방식이 이전의 연구들보다 더 나은 결과를 초래했다는 것을 볼 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;context information(i.e., features from succeeding and preceding utterances)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;논문의 모델이 이전 연구들과 다른 점은 recurrent nueral networks 혹은 self-attention을 사용하지 않았다는점과&lt;br /&gt;large text corpora에서 학습된 Transformer-based models에 의해 학습된 text representations로 부터 이득을 봤다는 점임&lt;/li&gt;
&lt;li&gt;저자들은 BERT의 deep features와&lt;br /&gt;token의 features의 sequence로 부터 temporal 정보를 추출하는 (논문에서 만든) 1D CNN layers의 능력이 좋은 결과를 초래하는 원인이라고 믿음&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;8. Multimodal Emotion Recognition&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 다른 weight 값들 $w_1$과 $w_2$로 실험함으로써 best speech와 best text model로 부터 나온 결과를 결합했음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제일 좋았던 값
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$w_1$ : 0.6&lt;/li&gt;
&lt;li&gt;$w_2$ : 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnMCg/btrqLXYTtKc/DlPt5hpHQhApjgk31n2Fo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnMCg/btrqLXYTtKc/DlPt5hpHQhApjgk31n2Fo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnMCg/btrqLXYTtKc/DlPt5hpHQhApjgk31n2Fo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnMCg%2FbtrqLXYTtKc%2FDlPt5hpHQhApjgk31n2Fo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;276&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 결과가 보여주는점은 speech model의 정확도가 text model의 정확도보다 높더라도, speech와 text 결과를 combining할 때 speech model의 결과에 더 적은 중요도를 주는것이 낫다는 것을 보여줌&lt;/li&gt;
&lt;li&gt;연구진들은 이 현상d이 TER과 SER models가 얻는 confidence score과 관련되어 있다고 믿음. 하지만 더 조사가 필요함&lt;/li&gt;
&lt;li&gt;Table1, 4, 6의 결과를 비교함으로써, emotion recognition task의 해결책은 서로 다른 data의 type들을 조합하는것으로 부터 이득을 얻을 수 있다는 결론을 내릴 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이들의 multimodal 결과가 speech-only 그리고 text-only 결과보다 더 좋게 나왔기 때문임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;연구진들은 그들의 좋은 결과가 나온 이유가 그들의 fusion 방식을 사용하지 않더라도 그들의 단일모델들이 다른 단일 모델들보다 더 좋은 성능을 보였다는 사실 덕분이라고 생각함&lt;/li&gt;
&lt;li&gt;그들은 더 정교화된 fusion 방식 혹은 speech와 text modalities를 더 연결성있게 학습시킴으로써 더 나은 결과를 낼 수 있다고 믿음&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;9. Concolusion&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논문의 모델은 high-level wav2vec features와 low-level mel-frequency spectrograms를 둘 다 활용할 수 있고 IEMOCAP dataset에 대해 70.1%의 정확도를 달성함&lt;/li&gt;
&lt;li&gt;TER에 대해서도 66.1% 정확도를 성취함&lt;/li&gt;
&lt;li&gt;fusion 결과에 대해서73.0% 정확도를 달성함&lt;/li&gt;
&lt;li&gt;emotion recognition이 disentanglement representation learning, high level data representations 그리고 multimodalities로 부터 이득을 볼 수 있다는것을 보여주면서 최신 연구들을 뛰어넘은 결과를 보여줌&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <category>deeplearning</category>
      <category>multi-modal</category>
      <category>speech and text</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <category>멀티모달</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/108</guid>
      <comments>https://luminitworld.tistory.com/108#entry108comment</comments>
      <pubDate>Sat, 8 Jan 2022 21:07:12 +0900</pubDate>
    </item>
    <item>
      <title>SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications 논문리뷰</title>
      <link>https://luminitworld.tistory.com/107</link>
      <description>&lt;h1&gt;Abstarct&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UAV의 카메라 시점에 의한 컴퓨터 비전에 관심이 많아짐&lt;/li&gt;
&lt;li&gt;하지만 UAV에서의 object detection을 실시간으로 처리하는 작업은 어려움&lt;/li&gt;
&lt;li&gt;마지막에는 &lt;code&gt;channel scaling factor&lt;/code&gt;에 L1 Regulation을 적용시켜서 convolution 계층의&lt;br /&gt;channel-level 희소성(sparsity)을 적용시키고 &amp;lsquo;slim&amp;rsquo;한 object detectors을 얻기 위해서&lt;br /&gt;덜 중요한 feature channel을 제거함&lt;/li&gt;
&lt;li&gt;fewer trainable parameters와 FLOPS를 original YOLOv3와 비교하여 제시함&lt;/li&gt;
&lt;li&gt;SlimYolov3을 VisDrone2018-Det benchmark dataset으로 평가&lt;/li&gt;
&lt;li&gt;unpruned 놈과 비교했을 때 FLOPS가 90.8%줄어들었고, parameter크기가 92% 줄었고&lt;br /&gt;running time이 2배 더 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diepMz/btrp55bKWVQ/yEhyHEuKGiNYJMJGcFuXi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diepMz/btrp55bKWVQ/yEhyHEuKGiNYJMJGcFuXi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diepMz/btrp55bKWVQ/yEhyHEuKGiNYJMJGcFuXi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiepMz%2Fbtrp55bKWVQ%2FyEhyHEuKGiNYJMJGcFuXi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;328&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다른 pruning 비율에 대한 실험 결과는 더 작은 구조의 SlimYOLOv3가 기존 YOLOv3보다 더 효율적이고 빠르다고 일관적으로 확인해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QekRB/btrp6QZnZi0/nFPd0TK87ksNqljby6KkH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QekRB/btrp6QZnZi0/nFPd0TK87ksNqljby6KkH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QekRB/btrp6QZnZi0/nFPd0TK87ksNqljby6KkH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQekRB%2Fbtrp6QZnZi0%2FnFPd0TK87ksNqljby6KkH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;493&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;challenging problems&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(1) 어떻게 다양한 변화를 다룰것인가 (항공사진에서 객체의 시각적 외형에 대한)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(variation : illumination, view, small sizes and ration)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(2) 제한된 메모리와 computing power을 가진 기기에 어떻게 deploy 할지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(3) detection 정확도와 실시간 요구에 대한 균형을 어떻게 맞출지&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 인기 있는 네트워크 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수동적(manually)으로 설계되었고,&lt;/li&gt;
&lt;li&gt;그 구조들에서 각 구성요소의 중요성은 학습되기 전에 결정될 수 없음&lt;/li&gt;
&lt;li&gt;Training 과정에서 network는 학습 가능한 계층의 weigth를 조절해가면서&lt;br /&gt;각 component의 중요성을 학습할 수 있음&lt;/li&gt;
&lt;li&gt;결과적을 network안의 몇몇 connection과 computations들은 불필요하거나 중요하지 않는 요소들이 될 수 있고 그러므로 성능에서 큰 저하 없이 제거될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;rarr; 이러한 추정으로 &lt;code&gt;model pruning&lt;/code&gt; 방식은 모델을 단순화시키는 데 사용됨&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVzIwT/btrp6dHy990/4KfaomFiskZcKIcGiDc0t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVzIwT/btrp6dHy990/4KfaomFiskZcKIcGiDc0t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVzIwT/btrp6dHy990/4KfaomFiskZcKIcGiDc0t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVzIwT%2Fbtrp6dHy990%2F4KfaomFiskZcKIcGiDc0t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;291&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Channel Pruning&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pruned model에 단지 구성 파일들 안의 대응되는 channel(or filter)의 개수를 수정함으로써&lt;br /&gt;적용하기 편리함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;fine-tuning&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그 후에 잠재적 일시적 저하를 보충하기 위해서 pruned models에서 수행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;rarr; 전문가에 의해 수동적으로 설계된 deep object detectors는 고유의 불필요한 중복성이 feature channels에 존재한다고 생각해서 parameter 크기와 FLOPS를 channel pruning으로 줄이려고 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgP8z0/btrp6xMAf0g/EqORT7mKr17UXflcUibUK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgP8z0/btrp6xMAf0g/EqORT7mKr17UXflcUibUK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgP8z0/btrp6xMAf0g/EqORT7mKr17UXflcUibUK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgP8z0%2Fbtrp6xMAf0g%2FEqORT7mKr17UXflcUibUK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;200&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;2. Related Work&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 Deep Object Detector&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;발전되면서 two-stage detectors와 single-stage detector로 구분됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgnR96/btrp1HCUgxY/SivFytx80KkoJDndxgtiL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgnR96/btrp1HCUgxY/SivFytx80KkoJDndxgtiL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgnR96/btrp1HCUgxY/SivFytx80KkoJDndxgtiL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgnR96%2Fbtrp1HCUgxY%2FSivFytx80KkoJDndxgtiL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;271&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-stage Detector&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Regional Proposal과 Classification이 순차적으로 이뤄짐&lt;/li&gt;
&lt;li&gt;Regional Proposal 진행 후 Classification 진행&lt;/li&gt;
&lt;li&gt;비교적 느리지만 정확도가 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Regional Proposal&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물체가 있을만한 영역을 빠르게 찾아내는 알고리즘&lt;/li&gt;
&lt;li&gt;ex) Selective search : 비슷한 질감, 색, 강도를 갖는 인접 픽셀로 구성된 다양한 크기의 window를 생성)&lt;/li&gt;
&lt;li&gt;object의 위치를 찾는 localization 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(기존의 sliding window의 방식은 모든 영역을 window로 탐색)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-stage Detector&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Regional Proposal과 Classification이 동싱 이뤄짐&lt;/li&gt;
&lt;li&gt;ex) YOLO, SSD 계열&lt;/li&gt;
&lt;li&gt;비교적 빠르지만 정확도가 낮음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 Model pruning&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;존재하는 model compression(모델 경량화) 방식은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;model pruning&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;knowledge distillation&lt;/li&gt;
&lt;li&gt;parameter quantization&lt;/li&gt;
&lt;li&gt;dynamic computation&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Model Pruning&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttTI3/btrp2DNKI9F/LRNxsfsn1U5vRPmijrdCJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttTI3/btrp2DNKI9F/LRNxsfsn1U5vRPmijrdCJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttTI3/btrp2DNKI9F/LRNxsfsn1U5vRPmijrdCJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttTI3%2Fbtrp2DNKI9F%2FLRNxsfsn1U5vRPmijrdCJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;210&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;model pruning 방식에서 deep models들로부터 제거되는 components는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;독립적인 neural connection 혹은 네트워크 구조들 자체가 될 수 있음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Weight Pruning&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;small weights로 덜 중요한 연결을 제거함(prune)&lt;/li&gt;
&lt;li&gt;개념적으로 이해하기 쉽지만, pruned model을 기억하고(store) 빠르게 하는 것이 어려움&lt;br /&gt;&amp;rarr; 생성된 &lt;b&gt;불규칙한 네트워크 구조&lt;/b&gt; 때문&lt;/li&gt;
&lt;li&gt;기술적으로 weight pruning은 특별한 소프트웨어 라이브러리 혹은 그에 맞는 하드웨어가 pruned model을 지원하도록 설계되지 않는다면, 실제 applications에 적합하지 않을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bap07t/btrp3VtSYAn/rFmhf3QPRKlsBKukOK6oh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bap07t/btrp3VtSYAn/rFmhf3QPRKlsBKukOK6oh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bap07t/btrp3VtSYAn/rFmhf3QPRKlsBKukOK6oh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbap07t%2Fbtrp3VtSYAn%2FrFmhf3QPRKlsBKukOK6oh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;169&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structured pruning(channel pruning)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Weight pruning과 달리 structured pruning이 &lt;b&gt;더 규칙적이고&lt;/b&gt; &lt;b&gt;다루기 쉬운 네트워크 구조&lt;/b&gt;를 생성할 가능성이 높음&lt;/li&gt;
&lt;li&gt;structured pruning을 위한 structured unimportance를 얻기 위해서&lt;br /&gt;연구원들은 structured sparsity learning을 포함하고 있는 structured sparsity regularization을 가진 &lt;code&gt;sparsity training&lt;/code&gt; 과 &lt;code&gt;channel-wise scaling factors의 sparsity&lt;/code&gt;에 의지함&lt;/li&gt;
&lt;li&gt;network slimming - 효율적인 channel pruning방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPkcFU/btrp6wz5bL6/BknE3kTFVe7e2OJxU56yv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPkcFU/btrp6wz5bL6/BknE3kTFVe7e2OJxU56yv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPkcFU/btrp6wz5bL6/BknE3kTFVe7e2OJxU56yv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPkcFU%2Fbtrp6wz5bL6%2FBknE3kTFVe7e2OJxU56yv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;274&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;network slimming&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;batch normalization&lt;/code&gt;의 &lt;code&gt;scaling factors&lt;/code&gt; 을 &lt;code&gt;channel-wise scaling factors&lt;/code&gt;로서 채택함&lt;/li&gt;
&lt;li&gt;이 &lt;code&gt;scaling factors&lt;/code&gt; 에 &lt;code&gt;L1 regularization&lt;/code&gt;을 사용하여 networks를 학습시킴&lt;/li&gt;
&lt;li&gt;hardware과 software에 한정되지 않고 pruned models를 실행하기 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. SlimYOLOv3&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biZvhJ/btrp1HXbKsm/7RhHbJvlBV3PH1KlcG9ju0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biZvhJ/btrp1HXbKsm/7RhHbJvlBV3PH1KlcG9ju0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biZvhJ/btrp1HXbKsm/7RhHbJvlBV3PH1KlcG9ju0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiZvhJ%2Fbtrp1HXbKsm%2F7RhHbJvlBV3PH1KlcG9ju0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;131&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;channel pruning을 YOLOv3에 적용하여 SlimYOLOv3을 얻음&lt;/li&gt;
&lt;li&gt;최소한의 수정으로 deep feature을 풍부하게(enrich) 하기 위해서 spatial pyramid pooling (SPP) module을 YOLOv3에 적용한 YOLOv3-SPP3가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;YOLOv3-SPP3&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SPP 모듈은 kernel size가 각각 1x1, 5x5, 9x9, 13x13의 크기인 4개의 병렬 maxpool 계층으로&lt;br /&gt;구성되어 있음&lt;/li&gt;
&lt;li&gt;SPP 모듈은 다른 receptive 영역을 가진 multiscale deep features을 추출하고&lt;br /&gt;feature maps의 channel dimension크기로 연결하여 이들을 통합할 수 있음&lt;/li&gt;
&lt;li&gt;같은 layer 내에서 얻은 multiscale features은 적은 computation cost로&lt;br /&gt;YOLOv3의 detection 정확도를 더 개선시킬 것이라고 기대함&lt;/li&gt;
&lt;li&gt;SPP 모듈에서 소개된 additional feature channels은 추가적인 FLOPS를 줄이거나 refined 할 수 있음&lt;/li&gt;
&lt;li&gt;SPP module을 YOLOv3의 각 detection header 앞의 5번째와 6번째 convolution 계층 사이에 넣어 통합함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sparcity training&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델의 channel-wise sparsity는 channel pruning과&lt;br /&gt;후에 제거될 잠재력이 있는 덜 중요한 channel들의 수를 설명하는데 도움이 됨&lt;/li&gt;
&lt;li&gt;channel pruning을 사용하기 위해서 &lt;code&gt;scaling factors&lt;/code&gt;을 각 channel마다 할당함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scaling factors&lt;/code&gt;의 절댓값이 channel의 중요도를 나타냄(denote)&lt;/li&gt;
&lt;li&gt;detection header를 제외하고 BN layer는 YOLOv3의 각 convolution layer 후 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybat1/btrp6d8C4sZ/fN3wLnOFaD3ICTswPZsqnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybat1/btrp6d8C4sZ/fN3wLnOFaD3ICTswPZsqnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybat1/btrp6d8C4sZ/fN3wLnOFaD3ICTswPZsqnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fybat1%2Fbtrp6d8C4sZ%2FfN3wLnOFaD3ICTswPZsqnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;160&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;BN Layer&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czOkOc/btrp5AiItpG/PkZjf81nEJUZKoNoH2vNZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czOkOc/btrp5AiItpG/PkZjf81nEJUZKoNoH2vNZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czOkOc/btrp5AiItpG/PkZjf81nEJUZKoNoH2vNZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczOkOc%2Fbtrp5AiItpG%2FPkZjf81nEJUZKoNoH2vNZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;74&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\gamma$ : &lt;code&gt;trainable scale factors&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;$\beta$ : bias&lt;/li&gt;
&lt;li&gt;${\sigma}^2$ : mini-batch안의 input features의 variance(변화량)&lt;/li&gt;
&lt;li&gt;$\bar{x}$ : mini-batch안의 input features의 mean(평균)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BN Layer들 안의 trainable 한 &lt;code&gt;scale factors&lt;/code&gt;은 channel의 중요도를 나타나는데 사용됨&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;L1 normarlization&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중요하지 않는 channel들로부터 중요한 channel을 효과적으로 구분하기 위해서,&lt;br /&gt;$\gamma$(trainable scale factor)에 대해서 L1 regularization을 부과함으로써&lt;br /&gt;channel-wise sparsity training을 수행함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sWP9q/btrp2CajFdZ/BR7CCFv2knOF2jKn8fWRy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sWP9q/btrp2CajFdZ/BR7CCFv2knOF2jKn8fWRy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sWP9q/btrp2CajFdZ/BR7CCFv2knOF2jKn8fWRy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsWP9q%2Fbtrp2CajFdZ%2FBR7CCFv2knOF2jKn8fWRy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;48&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$f(\gamma)=abs(\gamma)$ : L1-norm&lt;/li&gt;
&lt;li&gt;$\alpha$ : penalty factor (두 loss 사이의 간격을 균형 맞추는 요소)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Channel pruning&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\hat{\gamma}$ : gloab threshold - feature channel이 제거될지 말지 결정&lt;/li&gt;
&lt;li&gt;pruning ratio를 통제하기 위해서$\hat{\gamma}$ 는 모든 $abs(\gamma)$에 대해서 n-th percentile로 설정됨&lt;/li&gt;
&lt;li&gt;$\pi$ : safety threshold
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;convolution 계층에서의 over-pruning을 예방하고 network연결의 완전성을 유지하기 위함&lt;/li&gt;
&lt;li&gt;특정 layer의 모든 $abs(\gamma)$의 k-th percentile로 층마다 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$\hat{\gamma}$ 의 최소와 $\pi$ 보다 작은 scaling factors를 가진 feature channels를 제거&lt;/li&gt;
&lt;li&gt;maxpool layer과 upsample layer은 channel수와 연관이 없기 때문에 pruning 과정에서 버림&lt;br /&gt;(안 쓴다는 의미인듯)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;fine-tuning&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;channel pruning 이후 잠재적 일시적 저하를 보상하기 위해서 pruned models에 수행되도록&lt;br /&gt;제안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Iteratively pruning&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;over-pruning을 방지하기 위해 incremental pruning&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. Experiments&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 Datasets&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VisDrone2018-Det dataset consists of 7,019 static images captured by drone platforms in different&lt;br /&gt;places at different height&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 Models&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;YOLOv3-SPP1 : 수정된 YOLOv3로 첫 번 째 detector header의 앞에 SPP module이 1개
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;YOLOv3보다 COCO 데이터셋에 대해서 detection accuracy가 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;YOLOv3-SPP3 : YOLOv3의 3개의 detector header 앞에 5th와 6th convolution 사이 3개의 SPP module을 통합(incorporating)하여 구현됨&lt;/li&gt;
&lt;li&gt;SlimYOLOv3
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;channel pruning module의 global threshold $\hat{\gamma}$를 모든 $abs(\gamma)$의 50%, 90%, 95%의 pruning ration를 각각 적용한 3개의 모델을 구현&lt;/li&gt;
&lt;li&gt;local safety threshold $\pi$는 90% 적용한 모델의 각 layer에서 경험적으로 적용&lt;br /&gt;(단일 layer에 unpruned 된 channel을 최소 10% 유지하기 위해)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 Training&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sparsity training&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;100 epochs의 학습 진행&lt;/li&gt;
&lt;li&gt;penalty factor $\alpha$에 대해 0.01, 0.001, 0.0001 세 개의 다른 값에 대해 실험&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRX11/btrp2CnRwpg/hfxpkKEOpF3oIn1HdXikhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRX11/btrp2CnRwpg/hfxpkKEOpF3oIn1HdXikhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRX11/btrp2CnRwpg/hfxpkKEOpF3oIn1HdXikhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRX11%2Fbtrp2CnRwpg%2FhfxpkKEOpF3oIn1HdXikhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;274&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;5. Results and Discussion&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SPP Module의 효과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sF0er/btrp1IPkbzP/Jw2Fbm11Cse9CCkdaz1kCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sF0er/btrp1IPkbzP/Jw2Fbm11Cse9CCkdaz1kCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sF0er/btrp1IPkbzP/Jw2Fbm11Cse9CCkdaz1kCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsF0er%2Fbtrp1IPkbzP%2FJw2Fbm11Cse9CCkdaz1kCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;315&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpKJRs/btrp1Iog41c/gyJuL2CFrnK0oRQZdLAv2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpKJRs/btrp1Iog41c/gyJuL2CFrnK0oRQZdLAv2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpKJRs/btrp1Iog41c/gyJuL2CFrnK0oRQZdLAv2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpKJRs%2Fbtrp1Iog41c%2FgyJuL2CFrnK0oRQZdLAv2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1143&quot; height=&quot;483&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;416x416, 608x608에 대해서 SPP3와 SPP1을 비교했을 때 detection performance가 성능 차이가 거의 안 났지만 더 큰 input인 832x832일 경우에 mAP와 F1-score에 대해서 차이가 outperforms 할 수 있는 것을 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;rarr; &lt;b&gt;SPP 모듈&lt;/b&gt;이 &lt;b&gt;고해상도 이미지 안에서의&lt;/b&gt; 다른 크기의 receptive fields를 통해서 &lt;b&gt;유용한 multiscale deep feature를 detectors가 추출하도록 도와준&lt;/b&gt;다는 것임&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SPP module이 추가되면서 trainable parameter과 FLOPS는 증가되지만 무시할 수 있는 수치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sparsity training의 효과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q96Kt/btrp2B3vDTH/ZuyO9TopGLj2YgCrGRFOg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q96Kt/btrp2B3vDTH/ZuyO9TopGLj2YgCrGRFOg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q96Kt/btrp2B3vDTH/ZuyO9TopGLj2YgCrGRFOg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ96Kt%2Fbtrp2B3vDTH%2FZuyO9TopGLj2YgCrGRFOg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;508&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;rarr; Scaling factor의 분포의 변화와 YOLOv3-SPP3의 sparsity training 동안의 loss 그래프&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습 과정에서 상대적으로 작은 &lt;code&gt;scaling factors&lt;/code&gt;의 수가 증가하는 반면&lt;br /&gt;큰 &lt;code&gt;scaling factors&lt;/code&gt;의 수는 감소함&lt;/li&gt;
&lt;li&gt;sparsity 학습은 &lt;code&gt;scaling factors&lt;/code&gt; 값을 효율적으로 줄일 수 있고 convolution layers의 feature channel을 부족하게 만듦&lt;/li&gt;
&lt;li&gt;$\alpha=0.01$ 인 경우 &lt;code&gt;scaling factors&lt;/code&gt;을 너무 급하게 감소시켜서 모델이 underfitting으로 돼버림&lt;/li&gt;
&lt;li&gt;실험에서는 $\alpha=0.001$ 로 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbieKv/btrp7Q5F7nR/FHE72wKmCaDOVRG3WUiHu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbieKv/btrp7Q5F7nR/FHE72wKmCaDOVRG3WUiHu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbieKv/btrp7Q5F7nR/FHE72wKmCaDOVRG3WUiHu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbieKv%2Fbtrp7Q5F7nR%2FFHE72wKmCaDOVRG3WUiHu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;891&quot; height=&quot;232&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;channel pruning의 효과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDIeH2/btrp6l6ssGs/FolmMab9wqkpq6iQ38VP20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDIeH2/btrp6l6ssGs/FolmMab9wqkpq6iQ38VP20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDIeH2/btrp6l6ssGs/FolmMab9wqkpq6iQ38VP20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDIeH2%2Fbtrp6l6ssGs%2FFolmMab9wqkpq6iQ38VP20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;211&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FLOPS와 parameter size를 줄임&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>It공부/딥러닝논문리뷰</category>
      <category>yolo</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/107</guid>
      <comments>https://luminitworld.tistory.com/107#entry107comment</comments>
      <pubDate>Fri, 7 Jan 2022 19:27:52 +0900</pubDate>
    </item>
    <item>
      <title>Mecab 윈도우에서 단어사전 추가 및 우선순위조정</title>
      <link>https://luminitworld.tistory.com/104</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000;&quot;&gt;Mecab은 유명한 한국어 형태소 분석기입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이미 학습되어 있는 모델의 vocab를 load 해서 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 사용자가 vocab에 추가적으로 단어를 추가하여 mecab에 적용시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab은 원래 기본적으로 Linux에서 설치 및 진행이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 최근에는 window에서도 mecab을 설치하고 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 mecab을 window에서 사용하기 위해서 다음과 같은 과정을 거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(1) KoNLPy 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Mecab을 설치하기 전 우선 KoNLPy가 설치되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://liveyourit.tistory.com/56&quot;&gt;https://liveyourit.tistory.com/56&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627186176865&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법&quot; data-og-description=&quot;파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x&quot; data-og-host=&quot;liveyourit.tistory.com&quot; data-og-source-url=&quot;https://liveyourit.tistory.com/56&quot; data-og-url=&quot;https://liveyourit.tistory.com/56&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi7WDY/hyKZWRI6OQ/8OWn5MmcaRmDoQgzJdNbKK/img.png?width=800&amp;amp;height=535&amp;amp;face=0_0_800_535,https://scrap.kakaocdn.net/dn/rbe1D/hyKZXpx6Ij/20HUhEsXS8rgXeZw30YYT1/img.png?width=800&amp;amp;height=535&amp;amp;face=0_0_800_535,https://scrap.kakaocdn.net/dn/vymFO/hyKZ1ZMjZ7/d7k5qbVazpT0vDakMAMCl0/img.png?width=670&amp;amp;height=650&amp;amp;face=0_0_670_650&quot;&gt;&lt;a href=&quot;https://liveyourit.tistory.com/56&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://liveyourit.tistory.com/56&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi7WDY/hyKZWRI6OQ/8OWn5MmcaRmDoQgzJdNbKK/img.png?width=800&amp;amp;height=535&amp;amp;face=0_0_800_535,https://scrap.kakaocdn.net/dn/rbe1D/hyKZXpx6Ij/20HUhEsXS8rgXeZw30YYT1/img.png?width=800&amp;amp;height=535&amp;amp;face=0_0_800_535,https://scrap.kakaocdn.net/dn/vymFO/hyKZ1ZMjZ7/d7k5qbVazpT0vDakMAMCl0/img.png?width=670&amp;amp;height=650&amp;amp;face=0_0_670_650');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;liveyourit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2) Mecab 설치&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;① mecab-ko-msvc 설치&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://github.com/Pusnow/mecab-ko-msvc/releases/tag/release-0.9.2-msvc-3&quot;&gt;https://github.com/Pusnow/mecab-ko-msvc/releases/tag/release-0.9.2-msvc-3&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;해당 링크에 접속하여 본인의 윈도우 버전에 맞는 비트를 선택하여 다운로드를 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;c드라이브에 mecab폴더를 만들어주고 해당 폴더에 압축을 풉니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;② mecab-ko-dic-msvc.zpi 설치&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc/releases/tag/mecab-ko-dic-2.1.1-20180720-msvc&quot;&gt;https://github.com/Pusnow/mecab-ko-dic-msvc/releases/tag/mecab-ko-dic-2.1.1-20180720-msvc&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 링크에 접속하여 mecab의 dictionary 즉 vocab을 다운을 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 또한 압축을 아까 풀었던 위치에 동일하게 파일만 풀어지도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4rUmE/btrapFy9Zw2/sG2EZTubbCDRza86ompK1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4rUmE/btrapFy9Zw2/sG2EZTubbCDRza86ompK1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4rUmE/btrapFy9Zw2/sG2EZTubbCDRza86ompK1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4rUmE%2FbtrapFy9Zw2%2FsG2EZTubbCDRza86ompK1K%2Fimg.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;③ python wheel 설치&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://github.com/Pusnow/mecab-python-msvc/releases/tag/mecab_python-0.996_ko_0.9.2_msvc-2&quot;&gt;https://github.com/Pusnow/mecab-python-msvc/releases/tag/mecab_python-0.996_ko_0.9.2_msvc-2&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;python에서 mecab을 잘 적용시키게 하기 위해서 mecab python wheel을 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;본인이 사용 중인 python 버전에 맞게 설치를 해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 링크에서는 최대 python3.7까지만 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 파일들 중 cp뒤에 나타난 숫자가 파이썬 버전을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다운로드한 파일을 anaconda의 site-package 폴더에 옮겨 놓습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;site-package의 폴더 위치는 다음의 코드를 입력하면 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(저는 jupyter 환경에서 진행합니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1627188518360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import site; site.getsitepackages()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;경로를 알았으니&lt;b&gt; anaconda prompt&lt;/b&gt;를 열어서 해당 경로로 이동해주고 설치를 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;( 관리자 권한으로 열어줍니다. )&lt;/p&gt;
&lt;pre id=&quot;code_1627188780985&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# cd sitepackages경로
# pip install mecab_python-0.996_ko_0.9.2_mscv-cp37-cp37m-win_amd64.whl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치가 성공적으로 되었다면 anaconda prompt를 끄고 jupyter을 다시 실행시켜서 mecab이 적용되는지 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(3) Mecab 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;konlpy의 tokenizer은 다음과 같은 방식으로 기준을 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;형태소 단위 : mecab.morphs()&lt;/li&gt;
&lt;li&gt;명사 단위&amp;nbsp; &amp;nbsp; : mecab.nouns()&lt;/li&gt;
&lt;li&gt;품사 태깅&amp;nbsp; &amp;nbsp; : mecab.pos()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab을 이용하여 특정 문장을 형태소 분리를 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627189334538&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from konlpy.tag import Mecab
mecab=Mecab(dicpath='C:/mecab/mecab-ko-dic')
mecab.morphs('아 더빙 진짜 짜증 나네요 목소리')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['아', '더', '빙', '진짜', '짜증', '나', '네요', '목소리']&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결과를 보게 되면 전체적으로 형태소 분리가 비교적 잘 진행된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 '더빙'이라는 단어를 '더'와 '빙'을 분리하여 결과가 출력이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 이유는 mecab의 dictionary(단어 사전)에 해당 단어에 대한 정보가 없기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 사용자가 직접 '더빙'이라는 단어를 mecab의 단어 사전에 추가시켜 '더빙'으로 온전하게 형태소 분리가 가능하도록 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(4) Window에서 mecab 단어사전 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab의 폴더를 보면 크게 3개의 폴더로 이뤄져 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mecab-ko-dic : mecab의 단어 사전&lt;/li&gt;
&lt;li&gt;tools : 단어 사전에 단어를 추가시킨 후 컴파일 및 적용을 시켜주는 프로그램들 존재&lt;/li&gt;
&lt;li&gt;user-dic : 사용자가 추가적으로 추가한 단어에 대한 단어 사전&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단어 사전에 단어를 추가하는 프로세스는 크게 다음과 같이 진행이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. user-dic의 csv 파일에 형식에 맞게 추가하고 싶은 단어를 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. tools의 add-userdic-win.ps1라는 프로그램을 실행하여 컴파일 진행하여 추가 사항을 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 2번의 과정에 의해서 user-dic에서 설정한 csv파일이 mecab-ko-dic에 새로 csv파일이 만들어져서 단어 사전에 해당 단어가 적용됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 과정대로 진행해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;user-dic 폴더에 가면 다음과 같이 3개의 csv 파일이 존재합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9NTS/btranhy0Wyw/SXKriDOT2ieUPze9qSKh21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9NTS/btranhy0Wyw/SXKriDOT2ieUPze9qSKh21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9NTS/btranhy0Wyw/SXKriDOT2ieUPze9qSKh21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9NTS%2Fbtranhy0Wyw%2FSXKriDOT2ieUPze9qSKh21%2Fimg.png&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;nnp.csv는 명사, person.csv는 인명, place.sv는 등록되지 않는 장소에 대한 이름을 등록하는 csv 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;필자는 '더빙'이라는 명사를 단어 사전에 추가할 것이기 때문에 nnp.csv에 추가해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단어를 추가하기 전, 단어를 추가할 때 특정 양식을 맞춰줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;단어, 0, 0, 우선순위, 품사 태그, 종성 유무, 읽기, 타입, 첫 번째 품사, 마지막 품사, 원형, 인덱스 표현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 user-dic의 nnp.csv 파일을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627193217081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;C:/mecab/user-dic/nnp.csv&quot;, 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;['대우,,,,NNP,*,F,대우,*,*,*,*,*\n', '구글,,,,NNP,*,T,구글,*,*,*,*,*\n']&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적으로 '대우'라는 단어와 '구글'이라는 단어에 대해서 단어가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 '더빙'을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627193390591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;file_data.append('더빙,,,,NNP,*,F,더빙,*,*,*,*,*\n')
with open(&quot;C:/mecab/user-dic/nnp.csv&quot;, 'w', encoding='utf-8') as f: 
    for line in file_data: 
        f.write(line)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'더빙'이라는 단어를 단어 사전에 넣었으니 이제 컴파일을 시켜서 적용시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;윈도우 환경에서 진행한 것이기 때문에 window powerShell을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;( 관리자 권한으로 열어줍니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 현재 jupyter로 mecab을 사용하고 있던 상태였다면 window powerShell로 tools의 쉘 프로그램을 실행시킬 때 오류가 날 수 있으므로 jupyter을 종료시키고 다음 과정을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab파일들이 존재하는 디렉터리로 이동하고 다음 명령어로 컴파일을 진행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627194279985&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.\tools\add-userdic-win.ps1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;879&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uQhJ7/btraqRTIEFl/4sPiYHaWY70MvfecbNvkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uQhJ7/btraqRTIEFl/4sPiYHaWY70MvfecbNvkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uQhJ7/btraqRTIEFl/4sPiYHaWY70MvfecbNvkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuQhJ7%2FbtraqRTIEFl%2F4sPiYHaWY70MvfecbNvkc1%2Fimg.png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;879&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;done! 이 나오면 완료된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다시 jupyter을 실행시키고 mecab의 mecab-ko-dic 파일 안의 user-nnp.csv를 확인해보면 잘 적용된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627194504360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;C:/mecab/mecab-ko-dic/user-nnp.csv&quot;, 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['대우,1786,3545,3821,NNP,*,F,대우,*,*,*,*,*\n',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'구글,1786,3546,2953,NNP,*,T,구글,*,*,*,*,*\n',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'더빙,1786,3545,2953,NNP,*,F,더빙,*,*,*,*,*\n']&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 mecab으로 아까 인식을 못한 '더빙'의 단어가 잘 되는지 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;126&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AKoe1/btrao7W2QBV/u98mZfE7E9utGBlQd0iC2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AKoe1/btrao7W2QBV/u98mZfE7E9utGBlQd0iC2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AKoe1/btrao7W2QBV/u98mZfE7E9utGBlQd0iC2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAKoe1%2Fbtrao7W2QBV%2Fu98mZfE7E9utGBlQd0iC2k%2Fimg.png&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;126&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;적용이 잘 된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 간혹 안 되는 경우가 있으며 다른 문장에 대해서 안되는 경우도 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;111&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beK05E/btrao6cKOJ0/GWZeHjHSZyam5eXDziYX9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beK05E/btrao6cKOJ0/GWZeHjHSZyam5eXDziYX9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beK05E/btrao6cKOJ0/GWZeHjHSZyam5eXDziYX9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeK05E%2Fbtrao6cKOJ0%2FGWZeHjHSZyam5eXDziYX9K%2Fimg.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;111&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 이유는 우선순위가 낮기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(5) Window에서 mecab 단어 사전 우선순위 수정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선순위는 3번째 숫자인데 현재 '더빙'이라는 단어에 대해서는 2953이라고 있어서 이를 0번째로 바꿔 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab의 우선순위를 바꾸는데 linux에서는 쉽게 가능하지만 window에서는 추가적인 shell 프로그램을 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627194976340&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Pusnow/mecab-ko-dic-msvc: mecab-ko-dic for mecab-ko-msvc&quot; data-og-description=&quot;mecab-ko-dic for mecab-ko-msvc. Contribute to Pusnow/mecab-ko-dic-msvc development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1&quot; data-og-url=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/woqpi/hyKZ3Kd0QX/J5HKR2fSDQYCFSxH40k2uK/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_150_1054_234&quot;&gt;&lt;a href=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/woqpi/hyKZ3Kd0QX/J5HKR2fSDQYCFSxH40k2uK/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_150_1054_234');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Pusnow/mecab-ko-dic-msvc: mecab-ko-dic for mecab-ko-msvc&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;mecab-ko-dic for mecab-ko-msvc. Contribute to Pusnow/mecab-ko-dic-msvc development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 compile-win.ps1이 있어야 우선순위를 수정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 파일을 다운로드한 후&lt;b&gt; mecab의 tools 파일&lt;/b&gt;에 넣어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선순위를 수정할 때는 user-dic의 nnp.csv파일을 수정하는 것이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mecab-ko-dic폴더 안의 user-nnp.csv파일의 데이터를 수정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627195276123&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;file_data[2]='더빙,1786,3545,0,NNP,*,F,더빙,*,*,*,*,*\n'
with open(&quot;C:/mecab/mecab-ko-dic/user-nnp.csv&quot;, 'w', encoding='utf-8') as f: 
    for line in file_data: 
        f.write(line)
with open(&quot;C:/mecab/mecab-ko-dic/user-nnp.csv&quot;, 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;['대우,1786,3545,3821,NNP,*,F,대우,*,*,*,*,*\n',&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'구글,1786,3546,2953,NNP,*,T,구글,*,*,*,*,*\n',&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'더빙,1786,3545,0,NNP,*,F,더빙,*,*,*,*,*\n']&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선순위를 0으로 바꿔주었고 windows powerShell에서 앞서 다운한 compile-win.ps1을 실행시킵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1627195412576&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .\tools\compile-win.ps1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다시 jupyter로 돌아가서 아까 '더빙'이 적용되지 않는 문장에 mecab을 적용시키면 다음과 같이 잘 되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;118&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8LoC3/btrast58lKV/fsHmDpPKKyPlUcMjK23Tz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8LoC3/btrast58lKV/fsHmDpPKKyPlUcMjK23Tz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8LoC3/btrast58lKV/fsHmDpPKKyPlUcMjK23Tz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8LoC3%2Fbtrast58lKV%2FfsHmDpPKKyPlUcMjK23Tz1%2Fimg.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;118&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 mecab의 단어 사전에 새로운 단어 추가와 우선순위를 설정함으로써&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;추가적으로 형태소 분리가 잘 이뤄질 수 있게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 : &lt;a href=&quot;https://joyhong.tistory.com/128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://joyhong.tistory.com/128&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &lt;a href=&quot;https://hong-yp-ml-records.tistory.com/91&quot;&gt;https://hong-yp-ml-records.tistory.com/91&lt;/a&gt; &amp;nbsp;&lt;/p&gt;</description>
      <category>It공부/NLP</category>
      <category>mecab</category>
      <category>NLP</category>
      <category>window</category>
      <category>단어사전추가</category>
      <category>우선순위</category>
      <category>자연어처리</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/104</guid>
      <comments>https://luminitworld.tistory.com/104#entry104comment</comments>
      <pubDate>Sun, 25 Jul 2021 15:51:29 +0900</pubDate>
    </item>
    <item>
      <title>transformer</title>
      <link>https://luminitworld.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;transformer은 워낙 유명한 모델이며 현재 다양한 분야에서 응용되어 사용되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리하여 기본적인 작동에 대한 설명이 잘 되어 있는 글은 정말 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제 글은 transformer에서 특정 구조의 설계에 대한 이유,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;무슨 의도로 다음과 같이 구성을 하였는지에 대한 설명을 중점으로 기술하였습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(1) Seq2seq의 한계와 attention의 발전&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Attention&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;seq to seq의 문제점은 context vector가 고정된 크기로 되었다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입력 data의 문장의 길이와 상관없이 context vector가 고정되었다는 것은 긴 문장들의 경우에 과도하게 정보를 압축하게 되므로 정보의 손실이 발생되며 효율적이지 못한 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사람이 문장을 번역할 때 '어떤 단어'에 주목하여 그 단어의 변환을 수시로 하게 될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 모델에 적용하여 '입력과 출력의 여러 단어 중 어떤 단어끼리 서로 관련되어 있는가'라는 대응관계를 seq2seq에게 학습을 시킬 수 있다면 보다 훌륭하게 학습을 할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이에 따라서 attention 기법이 도입이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Encoder 변화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;attention이 도입되면서 seq2seq의 encoder부분에서 변화가 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존 context vector은 마지막 결과에 나오는 은닉 상태만을 고정된 벡터로 decoder에 넘겨서 수행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 개선하여 각 입력 단어들 마다의 문맥적 의미를 지닌, 각 LSTM으로부터 나온 은닉 상태 벡터를 모두 이용하여 &lt;b&gt;입력된 단어와 같은 수의 벡터를&lt;/b&gt; 얻어 이를 decoder에게 정보를 제공합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QComD/btq8reQ0xD3/GWgWpL3m55ZEiUWNclftx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QComD/btq8reQ0xD3/GWgWpL3m55ZEiUWNclftx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QComD/btq8reQ0xD3/GWgWpL3m55ZEiUWNclftx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQComD%2Fbtq8reQ0xD3%2FGWgWpL3m55ZEiUWNclftx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;431&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;시각별 LSTM계층의 은닉 상태&lt;/b&gt;에는 직전에 입력된 단어에 대한 정보가 많이 포함되어 있을 것이기 때문에 각 단어의 문맥을 나타내는 벡터라고 생각할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Decoder의 변화&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct46TY/btq8soZUjQq/W6vAiCc5wsWIFttCMvrPUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct46TY/btq8soZUjQq/W6vAiCc5wsWIFttCMvrPUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct46TY/btq8soZUjQq/W6vAiCc5wsWIFttCMvrPUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct46TY%2Fbtq8soZUjQq%2FW6vAiCc5wsWIFttCMvrPUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;413&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'어떤계산' 이라는 부분이 바로 attention기법이 적극적으로 도입되는 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정답에 대해 학습을 할 때 어떤 부분을 더 주목하여 데이터를 학습시킬 것인지가 바로 이 부분에서 이뤄지는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Encoder의 입력단어들에 대한 정보를 Decoder에서 참조합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Decoder은 Decoder의 입력 단어들에 대한 다음에 올 단어가 무엇인지 예측하는 과정에서 Encoder의 입력 단어와 Decoder의 입력 단어의 관계를 파악하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Decoder의 입력단어가 Encoder로부터 제공받은 단어들 중 어떤 단어와 연관성이 제일 높은지에 대한 정보를 고려하게 되는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'어떤 계산'의 input은 Encoder로부터 받을 hs와 decoder의 각 LSTM의 시각별 계층의 은닉 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 hs의 마지막 줄, seq2seq에서 context vector와 같이 LSTM의 첫 번째 계층에 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'어떤 계산'은 예시를 들어 역할을 설명하면 decoder의 &quot;I&quot;를 출력할 때 hs에서 &quot;나&quot;에 대응하는 벡터에 집중해서 학습되도록, 즉 해당 벡터가 비중 있게 선택되도록 하는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이에 따라 decoder의 단어에 대해서 encoder의 어떤 단어가 중요한지에 대한 각 단어의 중요도(기여도)를 나타내는 '가중치'를 별도로 계산해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중요도는 확률분포처럼 0.0~1.0 사이의 스칼라(단일 원소)이며, 모든 원소의 총합은 1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중요도가 구해지면 hs에 중요도(단일 원소)가 각 행에 스칼라곱을 하여 나온 결과의 행들의 합을 구하여 이를 맥락 벡터라고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5Tbv/btq8OjjwzTb/c7aeUVMdkyXBJb24RQ6pu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5Tbv/btq8OjjwzTb/c7aeUVMdkyXBJb24RQ6pu1/img.png&quot; data-alt=&quot;a가 바로 중요도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5Tbv/btq8OjjwzTb/c7aeUVMdkyXBJb24RQ6pu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5Tbv%2Fbtq8OjjwzTb%2Fc7aeUVMdkyXBJb24RQ6pu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;246&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;a가 바로 중요도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;중요도 구하는 법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중요도는 가중치로 데이터로부터 자동으로 학습할 수 있도록 구축되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;decoder의 LSTM계층의 은닉 상태 벡터(h)&lt;/b&gt;와 &lt;b&gt;hs&lt;/b&gt;를 '어떤 계산'에 입력으로 사용된다고 앞서 말했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 h의 벡터는 곧 decoder의 입력 단어에 대한 의미를 나타내는 벡터가 될 것이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중요도를 알려면 h와 hs의 각 단어 벡터들이 서로 얼마나 비슷한가(연관성이 있는가)를 알면 이것이 곧 중요도입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 개의 벡터의 비슷한 정도를 알기 위해 단순하게 '&lt;b&gt;내적&lt;/b&gt;'을 사용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 통해 중요도를 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이것이 가능한 이유는 hs와 h 모두 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;지속적인 학습을 통해서&lt;/b&gt;&lt;/span&gt; encoder과 decoder에 입력된 각각의 단어들에 대한 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;의미 벡터가 점차 형성&lt;/b&gt;&lt;/span&gt;이 될 것이며, ( 의미 벡터란 해당 단어가 언어에서의 문맥적 의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단어마다 의미 벡터는 우리가 사용하는 언어에 맞게 학습이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;특정 단어들 간에 연관성이 있다면 서로 의미 벡터들이 비슷한 방향으로 형성된다고 기대&lt;/b&gt;&lt;/span&gt;를 할 수 있고 그에 따라 내적으로 두 단어가 연관도가 높다는 것을 알 수 있어 중요도 값이 결정될 수 있는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;애초에 attention 매커니즘의 가정은 예시로 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인코더가 '고양이'를 받아서 벡터로 만든 결과는 Decoder가 'cat'을 예측할 때 쓰는 벡터와 유사할 것이라는 점입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nmbHx/btq8piNCLGN/QkisD9VumaaWKZvClmKKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nmbHx/btq8piNCLGN/QkisD9VumaaWKZvClmKKWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nmbHx/btq8piNCLGN/QkisD9VumaaWKZvClmKKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnmbHx%2Fbtq8piNCLGN%2FQkisD9VumaaWKZvClmKKWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;550&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2) Transformer&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Transformer&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 설명한 attention은 인간의 사고의 특징 attention을 자동화로 학습시킬 수 있는 체계를 컴퓨터로 구축이 가능하여 attention기법이 도입이 가능하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 attention 기법이 모델을 진화시키는데 핵심적인 역할을 또다시 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞서 설명한 모델의 큰 단점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바로 병렬 처리로 빠르게 계산을 하지 못한다는 단점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 이유는 바로 LSTM(RNN), 시계열에 의존하는 구조를 사용하기 때문에 동시에 계산을 할 수 있는 병렬 처리를 할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) 두 번째 LSTM은 첫 번째 LSTM의 결과에 종속성을 가지고 있어서 병렬 처리가 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 해결하려면 구조 자체를 바꿔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 LSTM(RNN)을 없애버리고 attention 기법을 사용하여 병렬 처리가 가능한 모델이 바로 transformer입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boSZN0/btq8OiEUezg/Xwsd52guurT21GE952Kgkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boSZN0/btq8OiEUezg/Xwsd52guurT21GE952Kgkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boSZN0/btq8OiEUezg/Xwsd52guurT21GE952Kgkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboSZN0%2Fbtq8OiEUezg%2FXwsd52guurT21GE952Kgkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;371&quot; height=&quot;533&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpEC5S/btq8uJCGWH6/vwcaSlk2Li57o5TEeMM7K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpEC5S/btq8uJCGWH6/vwcaSlk2Li57o5TEeMM7K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpEC5S/btq8uJCGWH6/vwcaSlk2Li57o5TEeMM7K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpEC5S%2Fbtq8uJCGWH6%2FvwcaSlk2Li57o5TEeMM7K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1431&quot; height=&quot;666&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Embedding&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통 입력 부분에서 임베딩 과정을 거칩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입력 차원을 입력하는 단어의 개수와 일치하게 해 줄 수 있게 하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입력값들을 임베딩 형태로 표현해주기 위해서 사용하는 계층입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;쉽게 말하면 단어의 의미를 숫자, 벡터로 표현해줄 수 있는 가장 단순한 작업입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞서 말했듯이 transformer는 seq2seq의 병렬적 한계를 해결하기 위해서 LSTM을 없애버렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;LSTM의 존재는 곧 단어들의 순서에 대한 정보가 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러한 LSTM이 없어졌으니 추가적으로 단어들의 위치를 표현해줄 정보가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;positional Encoding&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위치의 정보를 embedding 계층에 더하여 그 값을 encoder 혹은 decoder에 제공되도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음에는 embedding layer에 단순한 덧셈이 왜 위치에 대한 정보가 제공되는 것이고 encoder, decoder에 복잡한 덧셈과 곱셈들로 계산들이 존재하는데 이 위치정보가 유지되지 않을 것이라는 생각에 존재의 이유를 혼동하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위치의 정보를 embedding 계층에 더하게 되면 같은 단어라도 만약 다른 위치에 있을 시 입력값 자체가 다르게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 입력 자체에 위치에 대한 정보를 더하여 입력 자체가 위치정보를 가지니 encoder, decoder에 들어가서 해당 정보가 뚜렷하게 유지되는 것이 아니겠지만 분명하게 입력의 위치정보를 전달한 것이고, 다음에 입력에 같은 단어가 다른 위치에 오면 그것은 다른 수치의 입력값이 되므로 위치가 구분된다고 할 수 있는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이것이 바로 embedding 계층에 위치정보를 더하는 이유입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB4nDI/btq8HHzcEk0/tVtgXhrdWi1v90lbm9ggnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB4nDI/btq8HHzcEk0/tVtgXhrdWi1v90lbm9ggnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB4nDI/btq8HHzcEk0/tVtgXhrdWi1v90lbm9ggnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB4nDI%2Fbtq8HHzcEk0%2FtVtgXhrdWi1v90lbm9ggnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;100&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위치 정보에 대한 계산은 위와 같이 하며 cos과 sin을 사용한 이유는 문장의 길이마다 매 번 단순하게 값을 더하여 위치를 표현하는 것보다 고정적인 형태로 상대적 위치를 표현해주기 위함입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;transformer에서는 위치에 대한 정보가 함수로 주어졌는데 bert에서는 이러한 위치의 정보도 학습이 될 수 있도록 구현이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;residual learning&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존의 네트워크는 입력 x를 받고 layer을 거쳐 H(x)를 출력하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목적은 입력값 x를 타깃 값(정답) y로 mapping 하는 함수 H(x)를 얻는 것, H(x)와 y의 차이가 없도록 학습시키는 것이 목적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;residual learning은 출력과 입력의 차인 H(x)-x를 F(x)라고 할 때 F(x)를 최소화가 목적이 되어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;출력과 입력의 차이를 줄이는 F(x)가 0이 되는 것에 학습하는 것이 목적이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(F(x)는 input을 통과하는 함수)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgu6CG/btq8rVXI4Sy/fQjM4jGKZTLjxi2gPPFmK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgu6CG/btq8rVXI4Sy/fQjM4jGKZTLjxi2gPPFmK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgu6CG/btq8rVXI4Sy/fQjM4jGKZTLjxi2gPPFmK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgu6CG%2Fbtq8rVXI4Sy%2FfQjM4jGKZTLjxi2gPPFmK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;210&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(참조:&amp;nbsp;&lt;a href=&quot;https://phil-baek.tistory.com/entry/ResNet-Deep-Residual-Learning-for-Image-Recognition-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0&quot;&gt;https://phil-baek.tistory.com/entry/ResNet-Deep-Residual-Learning-for-Image-Recognition-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0&lt;/a&gt;&amp;nbsp;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;residual learning의 forward 측면에서 보게 된다면 중간의 계층들이 학습이 잘못될 경우 이를 예방해 주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예시를 들어 총 3개의 계층이 존재한다고 가정하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 두 번째 계층의 가중치들이 원치 않은 방향으로 학습될 시 residual이 없다면 첫 번째에서 제대로 학습된 결과물이 무시되므로 성능이 나빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 첫 번째 계층에서 residual을 수행하여 두 번째 계층을 건너뛰고 세 번째 계층에 들어가기 전으로 넘어간다고 가정하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째의 제대로 된 학습을 한 정보가 세 번째에 잘 전달되어 두 번 내에서 나쁘게 학습되더라도 성능 저하를 예방할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;residual learning의 구조의 설계 목적은 네트워크 계층이 깊어질수록 기울기 소실 혹은 폭발이 일어날 확률이 높아져서 그로 인해 학습이 제대로 되지 못하는 현상을 예방하고자 설계가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 다음과 같이 설계를 한 목적을 backward 측면에 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;backward의 측면에서 보면 덧셈의 역전파(backward)는 그대로 값을 흘러보냅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;residual learning은 이전의 값을 그대로 뛰어넘어 덧셈만을 수행했으니 역전파시 기울기가 넘어가면서 소실과 폭발을 예방할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;normalization 역시 residual learning과 마찬가지로 모델의 성능을 향상하는 역할 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Multi-Head Attention&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWAHFH/btq8rStQGmC/croonHPp6kzwkX60Y13NU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWAHFH/btq8rStQGmC/croonHPp6kzwkX60Y13NU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWAHFH/btq8rStQGmC/croonHPp6kzwkX60Y13NU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWAHFH%2Fbtq8rStQGmC%2FcroonHPp6kzwkX60Y13NU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;405&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQhOI/btq8q2DIPGx/KIhv8ypzqXqdpCVOL9c7w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQhOI/btq8q2DIPGx/KIhv8ypzqXqdpCVOL9c7w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQhOI/btq8q2DIPGx/KIhv8ypzqXqdpCVOL9c7w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQhOI%2Fbtq8q2DIPGx%2FKIhv8ypzqXqdpCVOL9c7w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;253&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Multi-head attention부분이 바로 앞서 설명한 seq2seq의 attention부분과 거의 유사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Multi-head attention의 입력은 크게 Query, Key, Value로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Query&lt;/b&gt;는 주가 되는 단어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;물어보는 단어로써 Query가 Key의 단어들과 어떠한 연관성이 있는지 모두 비교하게 되는 단어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Key&lt;/b&gt;는 정보를 제공하는 단어들의 집합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Value&lt;/b&gt;는 key에 대한 의미적 결과 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(Value의 존재 이유와 이에 대한 설명은 뒤에 자세히 다룹니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞서 seq2seq에서 구현했던 것과 마찬가지로 중요도를 구하는 과정이 바로 query와 key의 내적 과정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(transformer의 논문을 보면 seq2seq에서는 additive attention을 사용하여 관련 중요도를 구한 것이라고 나옵니다. 저는 '밑바닥부터시작하는딥러닝2'의 설명을 기반으로 seq2seq을 설명한 것이기 때문에 seq2seq에서 중요도를 구할 때 이미 내적인 'dot-product attention'을 사용하였습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query와 key의 내적 과정이 이뤄지고 나온 결과에 대한 softmax를 하여 중요도가 구해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 이 중요도와 key에 대한 결과 value와 곱을 하여 seq2seq와 마찬가지로 문맥 벡터가 구해지는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 문맥 벡터에 대한 정보, 즉 어떠한 단어에 집중해서 학습을 할 수 있도록 되는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;seq2seq의 LSTM의 구조를 대처한 부분이 바로 이 attention부분인 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 이름을 보면 Multi-head attention이고 그림을 봐도 head가 여러 개로 되어있는 attention인 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 head를 여러 개 두어서 학습을 시킨 이유는 문장을 학습하는데 다양한 관점에서 정보를 학습할 수 있도록 하기 위해서입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 다양한 attention 특징들을 가지는 여러 개의 head들을 만드는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;attention의 행렬적 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkfZC9/btq8L7qAK1b/6BacDF70nPDmreUpKIpeKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkfZC9/btq8L7qAK1b/6BacDF70nPDmreUpKIpeKK/img.png&quot; data-alt=&quot;여기서는 임베딩 차원 dmodle이 4이고 head의 수는 2라고 가정한것입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkfZC9/btq8L7qAK1b/6BacDF70nPDmreUpKIpeKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkfZC9%2Fbtq8L7qAK1b%2F6BacDF70nPDmreUpKIpeKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;322&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여기서는 임베딩 차원 dmodle이 4이고 head의 수는 2라고 가정한것입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOHKHh/btq8PwwaBxp/iAGFXsq7Ot2jL9U8JLRIU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOHKHh/btq8PwwaBxp/iAGFXsq7Ot2jL9U8JLRIU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOHKHh/btq8PwwaBxp/iAGFXsq7Ot2jL9U8JLRIU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOHKHh%2Fbtq8PwwaBxp%2FiAGFXsq7Ot2jL9U8JLRIU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;345&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결과로 나온 Attetion이 곧 문맥 벡터가 되며 결과의 차원은 각 query, key, value의 차원과 일치하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 과정이 하나의 head에 대한 과정이고 attention의 결과가 (3x2)로 나왔고 head의 수는 2이며, 위의 그림에서 head끼리 모두 concat을 하게 되면 (3x4) 모양으로 나오니, 맨 처음 입력한 (3x4)와 크기가 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Head 수가 2이기 때문에 W의 column 부분을 4 / 2(head 수) = 2라고 설정한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Linear layer 인 W의 수를 query, key, value 각각 head 수 만큼 만들면, 2x3 들이 각각 head 수 만큼 만들어 질 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만들어진 2x3 들이 각각 두 번 째 사진 과정을 거쳐서 2x3 이 head 수 만큼 생기게 되는 것이죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;attention의 softmax&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;softmax의 경우 중간 부분이 상대적으로 gradient가 크고 side로 가면 갈수록 작아지는 특징을 가지고 있는데 값이 너무 커지는 상태에서 softmax가 이뤄지면 side 쪽 gradient가 너무 작아 지기 때문에 이를 방지하여 특정 scale factor 만큼 곱해주어서(나눔) 값을 작게 만들어 학습이 잘 될 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;value 값이 의미하는 바&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞 서 seq2seq+attention에서는 query 역할을 하는 것이 h이고 key 역할을 하는 것이 hs입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(위의 그림 기준 h와 hs)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 중요도는 h와 hs 즉 query와 key의 내적으로부터 구하였고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 중요도를 다시 hs와 원소 별 곱을 하여서 Encoder로부터 받은 정보 hs 중에 어떤 것과 집중하여 학습을 할지 결정을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 hs가 바로 value입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, seq2seq+attention에서는 key와 value가 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 통해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;value라는 것은 key가 가지고 있는 단어별 의미 즉 값을 가지고 있는 벡터&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;key에 대한 의미적 결괏값이라는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;seq2seq+attention에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;value는 인코더의 단어들 각각에 대한 의미적 벡터를 가진 놈이자 곧 key이며 value 였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 transformer에서는 바로 이 key와 value를 분리해서 구성이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;key와 value 정보를 나눠서 서로 다른 파라미터로 학습시키면 결과가 더 좋아지기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(transformer에서는 attention이 self-attention(encoder ver, decoder ver), encoder-decoder attention 3가지가 있음을 고려)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;transformer에서 둘이 분리해서 사용할 수 있는 이유는 value자체의 의미와 value값이 형성되기 위한 transformer의 구조를 보면 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNSqzc/btq8rfCQ6lL/G3kWYBGCqnHn6u5qx3fiT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNSqzc/btq8rfCQ6lL/G3kWYBGCqnHn6u5qx3fiT0/img.png&quot; data-alt=&quot;여기서 w가중치의 행의 차원 길이는 (embedding 계층의 차원)/(head의 수)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNSqzc/btq8rfCQ6lL/G3kWYBGCqnHn6u5qx3fiT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNSqzc%2Fbtq8rfCQ6lL%2FG3kWYBGCqnHn6u5qx3fiT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;540&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여기서 w가중치의 행의 차원 길이는 (embedding 계층의 차원)/(head의 수)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그림의 가장 오른쪽에 나온 3개의 결과가 바로 각각 query key value입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query, key, value가 결과 값으로 나오는데 각각에 대한 가중치 행렬들이 존재하게 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 주목할 점은 이 3개 모두 가장 왼쪽에 있는 단어별 의미적 벡터를 가진 행렬을 input으로 가지고 모두 같은 계층에서 가중치의 계산이 이뤄진다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;같은 계층에서 동일한 형태의 계산이 이뤄진다는 것은 각각의 가중치에 대한 값과 결과가 모두 다르겠지만 의도하는 의미적 관점에서는 같다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;seq2seq에서 key와 value는 같았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 의미적으로도 같다는 뜻이고 위와 같이 같은 계층에서 같은 형태로 계산되도록 구조를 취한 동시에 key와 value 값을 분리한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리하여 위와 같은 구조는 key와 value가 분리되었음에도 불구하고 구조적으로 같게 하여 의미적으로 같은 역할이 가능하다고 기대할 수 있기 때문에 위와 같이 구성을 한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;attention의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZWuMH/btq8q2jqiZ9/BqzQQsq3eFSFqvzk97Mb0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZWuMH/btq8q2jqiZ9/BqzQQsq3eFSFqvzk97Mb0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZWuMH/btq8q2jqiZ9/BqzQQsq3eFSFqvzk97Mb0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZWuMH%2Fbtq8q2jqiZ9%2FBqzQQsq3eFSFqvzk97Mb0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;470&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Encoder Self-Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;encoder에서 입력된 단어 간의 관계를 알고 싶은 의도이므로 단어 모두 서로 참조를 하여 attention을 판단합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query, key, value 모두 encoder의 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Masked Decoder Self-Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;decoder에서 입력된 단어 간의 self-attention을 얻는 과정이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;attention의 중요도를 구할 시 자신의 단어의 오직 앞 단어들만 참조하여 중요도를 구하여 attention matrix를 구하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;decoder의 경우 attention 중에서 마스크가 씌워져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 attention을 할 시 고려해야 할 단어에 조건을 둬서 제한을 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query로 선정된 단어가 key들의 단어를 선정할 때 key들의 단어는 query의 단어의 오직 앞에 존재하는 단어들만 attention의 중요도 값을 구합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 이유는 decoder의 구조에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;decoder의 경우 입력으로 encoder의 입력에 대한 원하는 정답을 넣고 결과로 decoder의 입력된 단어 다음 단어를 예측하도록 설계가 되어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 현재 query의 단어 기준으로 뒤쪽의 단어도 attention을 하는데 참조를 한다면 이는 곧 정답을 cheating 하는 것과 마찬가지가 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 단어가 무엇인지 예측하는 것에 학습이 되는 decoder가 다음 단어인 뒷 단어들을 미리 참조하여 학습을 하는 꼴이 되는 것이기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리하여 decoder에서는 오직 앞 단어들만 고려하여 attention이 형성되도록 masking 과정을 거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query, key, value 모두 decoder의 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Encoder-Decoder Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Encoder의 입력 단어들의 의미 벡터를 참조하여 Decoder의 입력 단어가 Encoder의 단어들 중 어느 단어와 연관도가 높은지 파악하여 attention matrix를 구하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중요도를 구하는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;query는 Decoder의 값, key, value는 Encoder의 값이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=AA621UofTUA&quot;&gt;https://www.youtube.com/watch?v=AA621UofTUA&lt;/a&gt;&amp;nbsp; &amp;nbsp; (동빈나 님 자료)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밑바닥부터 시작하는 딥러닝 2 (한빛 미디어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transformer 논문&lt;/p&gt;</description>
      <category>It공부/Deep learning</category>
      <category>deeplearning</category>
      <category>Transformer</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/102</guid>
      <comments>https://luminitworld.tistory.com/102#entry102comment</comments>
      <pubDate>Wed, 30 Jun 2021 11:34:00 +0900</pubDate>
    </item>
    <item>
      <title>5. 카카오톡 access token 받아오기</title>
      <link>https://luminitworld.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Spinrg boot에서 만약 외부 라이브러리를 추가하고 싶다면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gigas-blog.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gigas-blog.tistory.com/112&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614936972623&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Gradle 외부 Jar 등록&quot; data-og-description=&quot;Spring Boot Project 를 만들면 Maven 이나 Gradle이 기본적으로 설치되어있습니다. 다양한 library 을 쉽고 간편하게 가져와서 쓸수 있지만 외부와의 통신을 허용하지 않는 개발 환경이 있기도 합니다. 이&quot; data-og-host=&quot;gigas-blog.tistory.com&quot; data-og-source-url=&quot;https://gigas-blog.tistory.com/112&quot; data-og-url=&quot;https://gigas-blog.tistory.com/112&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cceDZO/hyJscJvDtU/KlssbOdpmN26Io708M61r1/img.png?width=217&amp;amp;height=42&amp;amp;face=0_0_217_42,https://scrap.kakaocdn.net/dn/qF1av/hyJtEdlpRi/10WbK3IK4PVUS8M04rZVS1/img.png?width=217&amp;amp;height=42&amp;amp;face=0_0_217_42&quot;&gt;&lt;a href=&quot;https://gigas-blog.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gigas-blog.tistory.com/112&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cceDZO/hyJscJvDtU/KlssbOdpmN26Io708M61r1/img.png?width=217&amp;amp;height=42&amp;amp;face=0_0_217_42,https://scrap.kakaocdn.net/dn/qF1av/hyJtEdlpRi/10WbK3IK4PVUS8M04rZVS1/img.png?width=217&amp;amp;height=42&amp;amp;face=0_0_217_42');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Spring] Gradle 외부 Jar 등록&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Spring Boot Project 를 만들면 Maven 이나 Gradle이 기본적으로 설치되어있습니다. 다양한 library 을 쉽고 간편하게 가져와서 쓸수 있지만 외부와의 통신을 허용하지 않는 개발 환경이 있기도 합니다. 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;gigas-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 블로그를 참조하여서 했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 프로젝트에 특정 디렉토리에 내부에 다운로드 받은 외부 라이브러리 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 경로를 기억해놓은 상태에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;build.gradle 파일 vim으로 열어서 implementation files('경로')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정해주면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 intellij에 외부라이브러리 설정하고 싶다면&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://goddaehee.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;goddaehee.tistory.com/243&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614937123681&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[IntelliJ] IntelliJ 외부 라이브러리 추가하기(SpringBoot 외부 라이브러리 추가)&quot; data-og-description=&quot;[IntelliJ] IntelliJ 외부 라이브러리 추가하기(SpringBoot 외부 라이브러리 추가) 안녕하세요. 갓대희 입니다. 이번 포스팅은&amp;nbsp;[ [IntelliJ]&amp;nbsp;IntelliJ&amp;nbsp;외부&amp;nbsp;라이브러리&amp;nbsp;추가하기(gradle&amp;nbsp;외부&amp;nbsp;라이브러리&amp;nbsp;..&quot; data-og-host=&quot;goddaehee.tistory.com&quot; data-og-source-url=&quot;https://goddaehee.tistory.com/243&quot; data-og-url=&quot;https://goddaehee.tistory.com/243&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IKlrG/hyJsoQKhZj/k0OVjWlrz8KJuNHnKOuc30/img.png?width=433&amp;amp;height=116&amp;amp;face=0_0_433_116,https://scrap.kakaocdn.net/dn/dchGKH/hyJtBAVtuP/C8clQjjFcqh2GquQf4LkJK/img.png?width=433&amp;amp;height=116&amp;amp;face=0_0_433_116,https://scrap.kakaocdn.net/dn/cI3YEA/hyJtOmJCwe/fK0tkUriyNbUlcwxV7fam0/img.png?width=867&amp;amp;height=852&amp;amp;face=0_0_867_852&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goddaehee.tistory.com/243&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IKlrG/hyJsoQKhZj/k0OVjWlrz8KJuNHnKOuc30/img.png?width=433&amp;amp;height=116&amp;amp;face=0_0_433_116,https://scrap.kakaocdn.net/dn/dchGKH/hyJtBAVtuP/C8clQjjFcqh2GquQf4LkJK/img.png?width=433&amp;amp;height=116&amp;amp;face=0_0_433_116,https://scrap.kakaocdn.net/dn/cI3YEA/hyJtOmJCwe/fK0tkUriyNbUlcwxV7fam0/img.png?width=867&amp;amp;height=852&amp;amp;face=0_0_867_852');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[IntelliJ] IntelliJ 외부 라이브러리 추가하기(SpringBoot 외부 라이브러리 추가)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;[IntelliJ] IntelliJ 외부 라이브러리 추가하기(SpringBoot 외부 라이브러리 추가) 안녕하세요. 갓대희 입니다. 이번 포스팅은&amp;nbsp;[ [IntelliJ]&amp;nbsp;IntelliJ&amp;nbsp;외부&amp;nbsp;라이브러리&amp;nbsp;추가하기(gradle&amp;nbsp;외부&amp;nbsp;라이브러리&amp;nbsp;..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;goddaehee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그나마 이 블로그가 제일 근접한 답이었으나 이 또한 내 상황에서는 해결되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 나는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;intellij에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[files] -&amp;gt; [project structure] -&amp;gt; Modules -&amp;gt; Dependencies&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;를 가보면 다음과 같이 15 버전이 있었고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwt1P3/btqZfhDLUp8/0QbY3TIF4Qlvfeg9z3b4I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwt1P3/btqZfhDLUp8/0QbY3TIF4Qlvfeg9z3b4I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwt1P3/btqZfhDLUp8/0QbY3TIF4Qlvfeg9z3b4I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwt1P3%2FbtqZfhDLUp8%2F0QbY3TIF4Qlvfeg9z3b4I0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;외부에서 다운로드 받은 라이브러리는 위의 15를 더블클릭해서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMsv7R/btqZhfTfhrF/kAnzWkVTwRBptpuTUixyck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMsv7R/btqZhfTfhrF/kAnzWkVTwRBptpuTUixyck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMsv7R/btqZhfTfhrF/kAnzWkVTwRBptpuTUixyck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMsv7R%2FbtqZhfTfhrF%2FkAnzWkVTwRBptpuTUixyck%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[+] 버튼을 누르고 다운로드 받은 jar 라이브러리파일을 추가해줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 apply 시키면 잘 적용이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;참고로 위의 추가시킨 라이브러리는 java에서 jsonparser할 때 사용되는 라이브러리로&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;import &lt;/span&gt;org.json.simple.JSONObject&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;import &lt;/span&gt;org.json.simple.parser.JSONParser&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;import &lt;/span&gt;org.json.simple.JSONArray&lt;span&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;이런 놈들을 import 시킬 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;해당 라이브러리의 jsonparser 사용법은 다음 블로그를 참고하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://soft.plusblog.co.kr/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;soft.plusblog.co.kr/57&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614937471531&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] json-simple을 이용한 JSON 데이터 다루기 예제 (JSONParser, JSONObject, JSONArray 클래스를 이용한 예제&quot; data-og-description=&quot;자바에서 JSON 데이터를 다룰 일이 많다. 특히 REST API를 통해 데이터를 가져오는 경우 JSON 포맷을 사용하는 경우가 많기 때문에 JSON을 다루는 예제를 알아두면 좋다. 자바에서 JSON 포맷을 다루는 &quot; data-og-host=&quot;soft.plusblog.co.kr&quot; data-og-source-url=&quot;https://soft.plusblog.co.kr/57&quot; data-og-url=&quot;https://soft.plusblog.co.kr/57&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQr5fg/hyJsl7xAAg/JwVwCQgs0RZmU4eb2VoW7K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/koxGJ/hyJtEdlAv1/fJtI9L8vAkPPC7IfiiRYqk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bicDfu/hyJtJMtTmh/wS6nDON7ZqeafaMI1kkGXK/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280&quot;&gt;&lt;a href=&quot;https://soft.plusblog.co.kr/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soft.plusblog.co.kr/57&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQr5fg/hyJsl7xAAg/JwVwCQgs0RZmU4eb2VoW7K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/koxGJ/hyJtEdlAv1/fJtI9L8vAkPPC7IfiiRYqk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bicDfu/hyJtJMtTmh/wS6nDON7ZqeafaMI1kkGXK/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Java] json-simple을 이용한 JSON 데이터 다루기 예제 (JSONParser, JSONObject, JSONArray 클래스를 이용한 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;자바에서 JSON 데이터를 다룰 일이 많다. 특히 REST API를 통해 데이터를 가져오는 경우 JSON 포맷을 사용하는 경우가 많기 때문에 JSON을 다루는 예제를 알아두면 좋다. 자바에서 JSON 포맷을 다루는&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;soft.plusblog.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 설명은 intellij에 적용한것이지 실제 spring boot에서 build를 할 때 적용시키려면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 작업하고 있는 sprint boot 프로젝트 파일 내부에 원하는 파일을 만들고 추가시킬 외부라이브러리(ex) jar파일)를 넣어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 이후 dependency 설정을 해야하는데 spring boot의 도구 gradle에서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;build.gradle에서 dependency 설정을 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;외부라이브러리가 위치한 경로를 build.gradle에 적용시킴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bApbKm/btqZBeeyaDE/3gd8XGIOCESotPHupgBsBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bApbKm/btqZBeeyaDE/3gd8XGIOCESotPHupgBsBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bApbKm/btqZBeeyaDE/3gd8XGIOCESotPHupgBsBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbApbKm%2FbtqZBeeyaDE%2F3gd8XGIOCESotPHupgBsBK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 jsonparser 관련 라이브러리 의존성문제를 해결한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 카카오톡 서버로 부터 access token을 받아오는 방법은 아래의 블로그를 참고하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://alkhwa-113.tistory.com/41&quot;&gt;alkhwa-113.tistory.com/41&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614937599577&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;인증) OAuth 2.0 - 카카오인증 실습(feat. postMan)&quot; data-og-description=&quot;oAuth 2.0의 인증과정을 전 글에서 보았으니 실제로 포스트맨으로 실습을 해보자. 카카오 디벨로퍼 사이트에 가입한다. developers.kakao.com/ Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을&quot; data-og-host=&quot;alkhwa-113.tistory.com&quot; data-og-source-url=&quot;https://alkhwa-113.tistory.com/41&quot; data-og-url=&quot;https://alkhwa-113.tistory.com/entry/%EC%9D%B8%EC%A6%9D-OAuth-20-%EC%B9%B4%EC%B9%B4%EC%98%A4%EC%9D%B8%EC%A6%9D-%EC%8B%A4%EC%8A%B5feat-postMan&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/feNKs/hyJtGPIxw4/x7psrMK7IWZfninbVUiZJk/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/8FHMb/hyJtC0QQJB/DIF1SiseuQ3h7XHrKWZDJK/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/OvQV2/hyJscW1AMi/00wYRevEm6qCkB175Ipzik/img.png?width=987&amp;amp;height=741&amp;amp;face=0_0_987_741&quot;&gt;&lt;a href=&quot;https://alkhwa-113.tistory.com/41&quot; data-source-url=&quot;https://alkhwa-113.tistory.com/41&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/feNKs/hyJtGPIxw4/x7psrMK7IWZfninbVUiZJk/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/8FHMb/hyJtC0QQJB/DIF1SiseuQ3h7XHrKWZDJK/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/OvQV2/hyJscW1AMi/00wYRevEm6qCkB175Ipzik/img.png?width=987&amp;amp;height=741&amp;amp;face=0_0_987_741');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;인증) OAuth 2.0 - 카카오인증 실습(feat. postMan)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;oAuth 2.0의 인증과정을 전 글에서 보았으니 실제로 포스트맨으로 실습을 해보자. 카카오 디벨로퍼 사이트에 가입한다. developers.kakao.com/ Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;alkhwa-113.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 Redirect URL은 실습 시 존재하지 않는 url로 그냥 설정해도 잘 되었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;postman도 잘 되었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공식 카카오 rest api 홈페이지는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;developers.kakao.com/docs/latest/ko/kakaologin/rest-api&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614937691526&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Kakao Developers&quot; data-og-description=&quot;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&quot; data-og-host=&quot;developers.kakao.com&quot; data-og-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot; data-og-url=&quot;https://developers.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TRDEm/hyJtMCsFmm/UXDDHmsvpfetEZ5D402rs1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/cguKst/hyJsfTNW92/I0qq9yi4kpR9Ea8shP8kkk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/nEpyN/hyJsjaNMhH/k2sQ1i8hFIUoPO8Kkg79u1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TRDEm/hyJtMCsFmm/UXDDHmsvpfetEZ5D402rs1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/cguKst/hyJsfTNW92/I0qq9yi4kpR9Ea8shP8kkk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/nEpyN/hyJsjaNMhH/k2sQ1i8hFIUoPO8Kkg79u1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Kakao Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developers.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서도 참고해서 구현을 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 중요한점 중 하나는 허용IP주소 부분에 내 서버 ip를 넣어줘야&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Access token을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잊지말고 꼭 허용ip주소에 서버 ip주소 등록하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 이렇게 라이브러리 설정을 마치고 Spring boot 내부에서 카카오 server로 요청하는 코드를 구현하는 것은 아래의 블로그를 참고하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://antdev.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;antdev.tistory.com/37&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614937560700&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Kakao Login API] 카카오 계정의 유저 정보 받아오기 및 마무리 (Spring Boot 환경에서 카카오 로그인 API&quot; data-og-description=&quot;2019/03/22 - [OAuth/Kakao Login API] - [Kakao Login API] 카카오 로그인 API 서비스 구현 (Spring Boot 환경에서 카카오 로그인 API RESTful방식으로 연동하기 -3장) 2019/03/22 - [OAuth/Kakao Login API] - [..&quot; data-og-host=&quot;antdev.tistory.com&quot; data-og-source-url=&quot;https://antdev.tistory.com/37&quot; data-og-url=&quot;https://antdev.tistory.com/37&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjXqxK/hyJsjBS1lz/7Yk4b1xbfO3cmcPm3affuk/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719,https://scrap.kakaocdn.net/dn/b7JhjK/hyJshYoRYa/dthbK8TqW0sj8GBzbV8ykk/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719,https://scrap.kakaocdn.net/dn/cgXPpA/hyJscpdzy2/SOcx7KGfc9Kmb0uLA8OCN1/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719&quot;&gt;&lt;a href=&quot;https://antdev.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://antdev.tistory.com/37&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjXqxK/hyJsjBS1lz/7Yk4b1xbfO3cmcPm3affuk/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719,https://scrap.kakaocdn.net/dn/b7JhjK/hyJshYoRYa/dthbK8TqW0sj8GBzbV8ykk/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719,https://scrap.kakaocdn.net/dn/cgXPpA/hyJscpdzy2/SOcx7KGfc9Kmb0uLA8OCN1/img.png?width=782&amp;amp;height=719&amp;amp;face=0_0_782_719');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Kakao Login API] 카카오 계정의 유저 정보 받아오기 및 마무리 (Spring Boot 환경에서 카카오 로그인 API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;2019/03/22 - [OAuth/Kakao Login API] - [Kakao Login API] 카카오 로그인 API 서비스 구현 (Spring Boot 환경에서 카카오 로그인 API RESTful방식으로 연동하기 -3장) 2019/03/22 - [OAuth/Kakao Login API] - [..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;antdev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>It공부/Server</category>
      <author>dev_Lumin</author>
      <guid isPermaLink="true">https://luminitworld.tistory.com/100</guid>
      <comments>https://luminitworld.tistory.com/100#entry100comment</comments>
      <pubDate>Fri, 5 Mar 2021 18:48:47 +0900</pubDate>
    </item>
  </channel>
</rss>