<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sebam_dev.log</title>
        <link>https://velog.io/</link>
        <description>사이버 원예가 </description>
        <lastBuildDate>Mon, 21 Feb 2022 09:45:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sebam_dev.log</title>
            <url>https://velog.velcdn.com/images/sebam_dev/profile/ab25d693-f1e6-4b0c-a3f5-ef9a25c81b87/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sebam_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sebam_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[sdf file이란?]]></title>
            <link>https://velog.io/@sebam_dev/sdf-file%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@sebam_dev/sdf-file%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 21 Feb 2022 09:45:14 GMT</pubDate>
            <description><![CDATA[<h4 id="computational-chemistry-분야를-조금이라도-파고-들면-항상-sdf가-붙은-데이터를-마주치게-됩니다-제-본-전공도-아니고-입문한-지-얼마-되지-않았지만-저와-같은-상황에-마주친-분들을-위해-알고-있는-지식을-짧게-공유드리고자-합니다">Computational chemistry 분야를 조금이라도 파고 들면 항상 .sdf가 붙은 데이터를 마주치게 됩니다. 제 본 전공도 아니고, 입문한 지 얼마 되지 않았지만 저와 같은 상황에 마주친 분들을 위해 알고 있는 지식을 짧게 공유드리고자 합니다.</h4>
<br>

<h3 id="molecule-br">Molecule <br></h3>
<p>모든 분자는 그래프로 나타낼 수 있습니다. 예를 들어 물($H_2O$) 분자가 주어졌다고 해볼게요. 그러면 수소 원자 2개와 산소 원자 하나는 그래프의 node가 됩니다. 
그리고 분자 내부의 bond는 edge로 나타낼 수 있습니다. 그래프의 언어로 나타내면 
<br>
$$
\begin{aligned}
    G_{H_2O} = \mathcal{G}(V, E) \
    V = {H1, H2, O},  \quad E  ={(H1, O), (H2, O)}
\end{aligned} 
$$
<br>
라고 할 수 있습니다. (수소 1과 산소), (수소 2와 산소) 사이에 결합이 형성되어 있다는 의미이겠죠?
기본적으로 컴퓨터에서 한 분자에 대해 받는 정보는 아래와 같습니다.
<br></p>
<ul>
<li>분자 내 원자의 개수, 그리고 분자 내의 bond의 수</li>
<li>분자의 무게중심에 대한 각 원자들의 상대 좌표</li>
<li>어떤 원자들이 결합을 이루는지, 그리고 결합의 종류</li>
<li>additional descriptors<br>

</li>
</ul>
<h3 id="sdf-file-br">SDF file <br></h3>
<p>Structural Data Files 의 약어입니다. 대체로 아래 사진과 같은 모습을 하고 있습니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/79682443-e761-4371-ac0b-b9fe52806ee8/image.png" height="80%" width="80%">
</p>
크게 SDF 파일은 헤더, node features(원자 정보), edge features(결합 정보), extra property line으로 이루어집니다. 가장 많이 쓰이는 V2000 포맷의 경우 아래 사진과 같습니다. 

<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/6c213cfd-3b52-437a-8e3c-12a8d5228cb5/image.png" height="90%" width="90%">
  <figcaption align="center">Chem.libtext에서 가져온 figure. url은 아래 참고문헌에 있습니다. </figcaption>
</p>

<ul>
<li><p>Header block : 화학식 또는 어떤 database의 몇 번째 molecule인지. </p>
</li>
<li><p>Count line block : 원자 개수 | bond 개수 | additional feature line 개수 | ... | sdf 파일이 쓰여진 버전</p>
</li>
<li><p>Atom block : 각 원자의 상대좌표 | 원소 기호 | 부가적인 정보. </p>
<ul>
<li>부가적인 정보에 대해서는 더 공부하고 추가할 예정입니다. </li>
</ul>
<ul>
<li>Bond block : atom 1 | atom 2 | bond 종류 | stereo(cis인지 trans인지 등) | cbond topology(ring인지 등) | ...</li>
<li>Properties block : Count line block에서 미리 선언한 line 수만큼 부가적인 정보를 적어놓는 구간. </li>
</ul>
</li>
</ul>
<p>예를 들면 위 분자에서 2번 원자는 탄소, 4번 원자는 산소입니다. Bond block의 3번째 줄을 보면, 이 둘이 이중결합을 하고 있다는 것을 알 수 있습니다. 따라서 2번 원자는 아래 그림의 가장 가운데 위치한 탄소입니다. </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/a3ccf7a6-a544-4920-9e17-b04b0e93268a/image.png" height="84%" width="40%">
</p>

<h3 id="참고-문헌-br">참고 문헌 <br></h3>
<ul>
<li><a href="https://chem.libretexts.org/Courses/Intercollegiate_Courses/Cheminformatics_OLCC_(2019)/2._Representing_Small_Molecules_on_Computers/2.5%3A_Structural_Data_Files">https://chem.libretexts.org/Courses/Intercollegiate_Courses/Cheminformatics_OLCC_(2019)/2._Representing_Small_Molecules_on_Computers/2.5%3A_Structural_Data_Files</a></li>
<li><a href="https://en.wikipedia.org/wiki/Chemical_table_file">https://en.wikipedia.org/wiki/Chemical_table_file</a> </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Review] Multiscale Vision Transformers]]></title>
            <link>https://velog.io/@sebam_dev/Review-Multiscale-Vision-Transformers</link>
            <guid>https://velog.io/@sebam_dev/Review-Multiscale-Vision-Transformers</guid>
            <pubDate>Mon, 31 Jan 2022 11:23:08 GMT</pubDate>
            <description><![CDATA[<h5 id="recommended-prior-readings--transformer--vision-transformer-brbr">Recommended Prior Readings : <a href="https://arxiv.org/abs/1706.03762">Transformer</a> / <a href="https://arxiv.org/abs/2010.11929">Vision Transformer</a> <br><br></h5>
<h2 id="introduction-br">Introduction <br></h2>
<ul>
<li>최근(21년 4월 기준으로) ViT나 DeiT와 같은 vision transformer 계열 모델들이 발군의 성능을 보이고 있음. <br></li>
<li>한편 CNN의 feature hiarachy를 적용한 연구는 아직 없었음. feature hiarachy라 함은 CNN에서 이미지에 가까운 layer일수록 간단한 특징을 잡아내는 커널이, mlp head에 가까운 layer일수록 복잡한 특징을 잡아내는 커널이 분포하는 것을 일컬음. <br></li>
<li>이미지는 물론, action classification에도 적용이 가능한 모델.<br></li>
<li>이를 이용함으로써 imagenet 21K pretrainig을 한 VTN이나 ViViT보다 월등한 성능을 얻음.</li>
</ul>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/f4073a51-56e9-48de-bd67-490ef8891bd3/image.png" height="50%" width="50%">
  <figcaption align="center">논문에서는 ViViT보다 6.8배 적은 계산량에 파라미터 수는 1/8.5라고 한다.</figcaption>
</p>
- Related work에 분야별로 transformer 연구에 대해 아주 잘 적혀있어서 꼭 보면 좋을듯.

<p><br><br></p>
<h2 id="the-model-br">The Model <br></h2>
<h3 id="pooling-attention">Pooling Attention</h3>
<ul>
<li><p>기존의 MHA(Multi-Head Attention)을 <strong>pooling attention</strong>으로 대체함. 예를 들어 </p>
<ul>
<li>Input Video $\mathbf{X&#39;} \in \mathbb{R}^{(T&#39;H&#39;W&#39;C)}$ 이고 </li>
<li>ViViT 식으로 임베딩된 토큰 tensor가 $\mathbf{X} \in \mathbb{R}^{(THW\times D)}$일 때 </li>
<li>D = embedding dimension, L = THW라 하자. </li>
</ul>
</li>
<li><p>그러면 Transformer에 들어오는 tensor shape은 $\mathbf{X} \in \mathbb{R}^{(L\times D)}$일 것. <br></p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/0636ced4-6111-4433-bd50-12ecf4a0b6a7/image.png" height="50%" width="50%">
</p>

</li>
</ul>
<p>input tensor는 위 그림에서 보라색인 Linear layer를 지나면서 vanilla transformer식 QKV 임베딩을 거친다. 식으로 나타내면 아래와 같다 : </p>
<p>$$
\begin{aligned}
    \hat{Q} = XW_Q , \hat{K} = XW_K, \hat{V} = XW_V, W\in \mathbb{R}^{D\times D}
\end{aligned} 
$$</p>
<p>그 다음 3D CNN에서 자주 사용하던 것과 같이 dimension reduction을 한다. 무슨 말이냐면 pooling을 하는 임의의 어떤(max/average/conv) 커널이 있고, kernel size, stride, padding을 조정해서 L을 줄인다는 것.</p>
<p>논문에서는 아래와 같이 정의했다 : </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/fb8ec232-5166-48b3-a056-501c32a527d6/image.png" height="50%" width="50%">
</p>

<p>이제 QKV는 차원이 $\tilde{T}\tilde{H}\tilde{W}\times D$가 되고, $\tilde{T} = T/s_T$가 된다. H와 W도 마찬가지이다. 식으로 나타내면 </p>
<p>$$
\begin{aligned}
    Q = \mathcal{P}(\hat{Q}) , K = \mathcal{P}(\hat{K}), V = \mathcal{P}(\hat{V}), \quad Q, K, V \in \mathbb{R}^{\tilde{T}\tilde{H}\tilde{W}\times D}
\end{aligned} 
$$</p>
<p>그 다음 <strong>pooling 된 QKV</strong>로 attention을 하는데, 이건 기존 transformer의 어텐션과 동일한 방식이다 : </p>
<p>$$
\begin{aligned}
    \textbf{Attention(Q,K,V)} = \text{Softmax}(QK^T/\sqrt{d})V
\end{aligned} 
$$</p>
<p>이때 d는 head 하나의 dimension이다. 이후에는 layernorm 하고 residual path를 만드는 방식으로 기존의 transformer architecture를 그대로 차용했다. </p>
<h3 id="multiscale-transformer-network">Multiscale Transformer Network</h3>
<ul>
<li><p>3D CNN처럼, 깊어질수록 spatial dimension은 줄이되 channel dimsnsion은 늘려 나간다. 이를 위해 CVT와 같이 <strong>Scale stage</strong>를 4단계로 나눈다. </p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/5c17b624-27f1-44f5-b414-7812efed26f1/image.png" height="60%" width="60%">
</p>
</li>
<li><p><strong>data layer</strong> : 그냥 dataloader이다. 우리가 가지고 있는 비디오를 <strong>프레임 간격 $\tau$</strong> 로 샘플링한다. 예를 들어 120프레임짜리, H=W=224인 비디오가 있다면 data layer를 거치고 나서는 THW=T/$\tau$, H, W가 된다. $\tau$는 2, 4를 사용하였다. <br></p>
</li>
<li><p><strong>cube1</strong> : CvT와 비슷한 embedding layer이다. Kernel size = $[c_T, c_H, c_W]$인 convolution을 사용하고 stride는 $[s_T, s_H, s_W]$가 되도록 한다. MViT-Base model의 경우 $\mathbf{K}=[3,7,7]$, $\mathbf{S}=[2,4,4]$를 사용하였으며 embedding dimension은 96으로 하였다. </p>
<br>
여기서 큰 문제가 하나 발생하는데, 만약 들어온 비디오의 THW=64,224,224라고 하면 data layer를 거치고 나서는 16,224,224가 되고, embedding을 거치면 patch의 수가 $8\times56\times56+1=25089$개가 된다. 만약 16-bits training을 한다고 하면 한 비디오에서 나오는 attention weight matrix의 용량이 1.3GB에 달한다. 결국 본 논문에서는 64GPU에 한 gpu당 batch size = 8로 세팅하였다. 
<br></li>
<li><p><strong>scale2~5</strong> : transformer layer. embedding하는 패치들의 spatial resolution은 줄여나가면서(==receptive field를 키우면서) embedding dimension은 2배씩 늘려나가는 전략을 취한다. 여기에는 4가지의 중요한 요소가 있다 : </p>
<ul>
<li><p><strong>query pooling</strong> : CvT의 근본이 되는 작업. 기존의 ViT들은 naive하게 각각 patch들을 linear layer를 태워서 QKV로 만들었으나 MViT는 3x3x3 Conv를 사용해 query를 만든다. 논문에는 나와 있지 않지만 아마 depthwise-separable convolution을 사용했을 것이고, max나 avgpool보다 성능이 확연하게 좋았다고 한다. </p>
</li>
<li><p><strong>key/value pooling</strong> : 하지만 가만 생각해 보면 attention block에서 최종적인 output dimension을 정하는 것은 query이다. 예를 들어 $\mathbf{Q}\in\mathbb{R}^{N_Q, d_{emb}}$이고 $\mathbf{K, V}\in\mathbb{R}^{N_V, d_{emb}}$라 한다면 Attention score matrix $\mathbf{a} = \mathbf{Q}\mathbf{K}^T/\sqrt{d_{emb}}$는 $N_Q\times N_V$의 shape을 갖게 될 것이며 output energy $\mathbf{e} = \mathbf{Q}\mathbf{K}^T/\sqrt{d_{emb}}\cdot \mathbf{V}$는 query의 차원을 그대로 따라간다. 
요점만 말하면 key/value를 생성하는 conv kernel의 stride를 1보다 크게 만들자는 것이다. 논문에서는 $[s_T, s_H, s_W] = 2, 4, 4$를 사용했을 경우가 계산량 대비 성능이 가장 좋았다고 한다. 하지만 성능이 가장 좋았던 모델은 <strong>stride=1로 두는 모델</strong>이다. 이는 CvT에서의 실험과 일치하는 결과이다. 어찌되었든 stride&gt;1이면 필연적으로 downsampling이 되기 때문에 일어나는 현상으로 보인다. </p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/f4b998cb-87cf-47a5-9083-0feda3303389/image.png" height="60%" width="70%">
</p></li>
<li><p><strong>skip-connection position</strong> layernorm 뒤에 skip connection path를 만드는 것이 가장 좋은 성능을 보였다. </p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/d131534a-4d59-481c-ba80-45e77e1f9b9c/image.png" height="60%" width="60%">
</p></li>
<li><p><strong>positional encoding</strong> : ViT의 경우엔 PE 자체가 성능에 아무런 영향을 미치지 않았다. 반면 MViT는 시간축과 공간축에 독립적인 PE를 채택했다. 구현 방법은 나오지 않아 코드를 참조해야 할 것 같다. </p>
</li>
</ul>
<p><br> <br></p>
</li>
</ul>
<h2 id="tasks-and-downstream-tasks">Tasks and Downstream tasks</h2>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/8b45a40b-cff5-4cc0-8341-e2a55b6f289f/image.png" height="100%" width="100%">
</p>

<p>ViT-base와 두 MViT 모델을 만들어 실험했다. 위의 실험 결과는 Kinetics-400 dataset에서 baseline 모델들을 테스트한 결과. 여기에 리폿된 77.2%와 같은 결과는 QKV pooling을 할 때 maxpool을 적용한 결과로 보인다. 흔히 vision transformer 계열에서 <strong>view</strong>라는 단어를 사용하는데, 이는 test 당시에 &quot;하나의 비디오에서 몇 번 다른 sampling을 하였는가&quot; 로 <a href="https://arxiv.org/pdf/1812.03982.pdf"> 정의된다. </a> 본 논문에서 모든 실험은 spatial하게 하나의 center crop만을 사용하고 temporal하게 5번의 sampling을 통해 score를 낸다. </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/41820ab8-2d49-4928-b1bb-1aa52c36aa59/image.png" height="55%" width="55%">
</p>

<p>K400 dataset에서 가장 좋은 성능을 거둔 모델은 input video를 3프레임 간격으로 샘플링해 64프레임을 사용한 모델. 어찌되었든 input data 크기가 커질수록 성능이 올라가는 건 당연하다. 하지만 아무런 pre-training이 없었다는 점이 주목해야 할 부분이다. </p>
<h3 id="imagenet-1k">Imagenet-1K</h3>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/27679675-2a69-46b1-9356-f1b06d268e08/image.png" height="55%" width="55%">
</p>

<p>사실상 CvT랑 별반 다를 게 없는 결과. 비디오 모델이지만 concurrent한 이미지 모델에 비해 뒤지지 않는 성능이다.</p>
<h3 id="ssv2">SSv2</h3>
<p>Something-something-V2의 약자로, human-object interaction에 초점이 맞춰진 데이터셋이다. 물체가 무엇인지는 중요하지 않고 비디오에서 사람이 하고 있는 행위가 중요한 데이터셋. 라벨들은 아래와 같다 : </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/cbaa8a70-a73f-4b59-a4de-8214802df677/image.png" height="45%" width="45%">
</p>

<p>성능 리포트할 때에는 kinetics 400/600 pretraining을 거친 모델을 사용했다. 다른 논문들도 그렇고, paperswithcode에서 <a href="https://paperswithcode.com/sota/action-recognition-in-videos-on-something"> 살펴보면 </a> pretraining을 하지 않은 모델들이 거의 없다. 아마 spatio-temporal modeling이 어려워서 더 큰 데이터셋에 훈련시키고 테스트한 것이 아닌가 싶지만, pretraining을 하지 않고 성능이 얼마나 나올지도 궁금하긴 하다. </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/7d168386-037f-407b-a4a6-90d0c6ee05f4/image.png" height="55%" width="55%">
</p>

<h3 id="charades">Charades</h3>
<p>평균 길이 30초의 long ranged video들을 모아놓은 데이터셋. 신기하게도 TokenLearner가 SOTA 자리를 지키고 있다. 뿐만 아니라 TokenLearner는 additional pretraining을 하지 않았다. MViT는 k400/600 pretraining을 했으며, 성능은 아래와 같다. </p>
<p align="center">
  <img src="https://images.velog.io/images/sebam_dev/post/86554043-558b-425b-9b21-cbad19ae3584/image.png" height="55%" width="55%">
</p>

<p>  <br> <br></p>
<h2 id="miscellaneous">Miscellaneous</h2>
<ul>
<li><p>frame을 shuffle해서 넣어주면(==비디오 프레임 순서를 바꿔 학습시키면) 아래와 같이 성능이 크게 떨어진다. 모델의 temporal modeling이 잘 되었음을 보여주는 실험.</p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/55a6ac84-9f60-4ddd-ba51-ab5cafe32caa/image.png" height="55%" width="55%">
</p>
</li>
<li><p>view에 따른 cost VS accuracy</p>
<p align="center">
<img src="https://images.velog.io/images/sebam_dev/post/9c682361-c44e-40a4-84fe-3807833f0f26/image.png" height="105%" width="105%">
</p>

</li>
</ul>
<p>크게 확대해 보면 각 scatter마다 몇 개의 view가 사용되었는지 나타나 있다. imagenet pretraining을 한 VTN이나 VIVIT보다 월등한 계산량 대비 성능을 보였으며 CNN 기반 모델들도 이겼다. </p>
<ul>
<li><p>다만 조금 걸리는 것은 왜 transformer 기반 모델들이 charades video dataset에서 그렇게 성능이 낮았으며, tokenlearner는 왜 성능이 그렇게 높은지 의문이다. 과연 video 영역에서도 이미지 모델과 비슷한 attention을 사용하는 것만이 답일까?</p>
</li>
<li><p>TokenLearner를 보면 확실히 key information을 내재하고 있는 토큰들은 불과 몇 개에 지니지 않는다는 점은 확실해 보인다. AdaViT처럼 stochastic하게 attention을 하고 TokenLearner처럼 token purning을 진행하면 더 개선된 모델을 만들 수 있지 않을까 하는 생각이 든다. </p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>