<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>세균맨</title>
    <link>https://bayesian-bacteria.tistory.com/</link>
    <description>- 짤랑과 일상
- 이것저것 관찰하기
- 덕업일치를 위한 몸부림: ML</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 07:47:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BayesianBacteria</managingEditor>
    <image>
      <title>세균맨</title>
      <url>https://tistory1.daumcdn.net/tistory/6774509/attach/0632eaf77c3b4f90828739f2a8dd0735</url>
      <link>https://bayesian-bacteria.tistory.com</link>
    </image>
    <item>
      <title>(3.5/5.0) 이문설농탕: 두한이 형님의 맛집</title>
      <link>https://bayesian-bacteria.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고대식당도굴기-챕터 2&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;이문설농탕 In a nutshell&lt;/b&gt;&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;li&gt;깍두기가 매우 맛있다. 나 깍두기 잘 안 먹는데. (그래서 신빙성 없을지도)&lt;/li&gt;
&lt;li&gt;뭔가 통통한 밥알.&lt;/li&gt;
&lt;li&gt;무난히 맛있는 설렁탕.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입구&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;고대 종로&quot;의 느낌이 잘 훈제되어 있는 간판. 물론, 이문설농탕 (123세) 은 2011년에 지금 집으로 이사했다. 지금은 무너졌다고 하는 100년 된 한옥집이 궁금해지는 시점이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0885.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZ31n/btsMK3iXnBP/4XYoDCAY53rmgq5dHkpS9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZ31n/btsMK3iXnBP/4XYoDCAY53rmgq5dHkpS9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZ31n/btsMK3iXnBP/4XYoDCAY53rmgq5dHkpS9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZ31n%2FbtsMK3iXnBP%2F4XYoDCAY53rmgq5dHkpS9K%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;513&quot; height=&quot;684&quot; data-filename=&quot;IMG_0885.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 들어가면, 입구. 충분히 낡지 않아서 아쉽달까. 언제부터 낡은 것들이 선호되기 시작했을까? 모두가 여유로워지고부터 일까 아니면 지금이 싫어서일까? 어느 쪽 일지 궁금하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0886.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tNg4q/btsMMeXUl1Y/moIUWNgjVWzvANdm0C3gk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tNg4q/btsMMeXUl1Y/moIUWNgjVWzvANdm0C3gk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tNg4q/btsMMeXUl1Y/moIUWNgjVWzvANdm0C3gk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtNg4q%2FbtsMMeXUl1Y%2FmoIUWNgjVWzvANdm0C3gk1%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;483&quot; height=&quot;644&quot; data-filename=&quot;IMG_0886.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내부와 음식&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0888.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9qgu/btsMMF8IYbY/DhrcYceFNkjKorBCgWEBl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9qgu/btsMMF8IYbY/DhrcYceFNkjKorBCgWEBl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9qgu/btsMMF8IYbY/DhrcYceFNkjKorBCgWEBl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9qgu%2FbtsMMF8IYbY%2FDhrcYceFNkjKorBCgWEBl1%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;484&quot; height=&quot;645&quot; data-filename=&quot;IMG_0888.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;차림표&quot;의 느낌은 압권이다. 아마 이전 가게에서 그대로 가져온 걸까? 그렇다면, 이 가게의 최고 어른님은 차림표일 것이다. &quot;마나&quot; 란 대체 뭘까? 정신력이 채워질 것 같은 느낌이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0893.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct281p/btsMKVyvaZF/fSGQWKpKxaXb27ydNv5Sek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct281p/btsMKVyvaZF/fSGQWKpKxaXb27ydNv5Sek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct281p/btsMKVyvaZF/fSGQWKpKxaXb27ydNv5Sek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct281p%2FbtsMKVyvaZF%2FfSGQWKpKxaXb27ydNv5Sek%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;482&quot; height=&quot;643&quot; data-filename=&quot;IMG_0893.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;설렁탕 좀 말아온나&quot;, &quot;대파 많이&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밥알이 통통하다. 고기의 양도 많다. 종로에서 설렁탕 잘한다고 하는 곳을 가면, 보통 집에서 먹을 때처럼 고기를 많이 주더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국밥을 선호하는 사람으로서, 설렁탕이나 곰국에 손이 잘 안 가는 이유는 고기의 양이 감질나서인데---즉, 한 숟갈마다 1 고기를 못함---여기는 한 숟갈 한 고기를 할 수 있다. 두한이 형님은 여기에 매력을 느끼신 걸까. 그 시절엔 사실 이렇게 고기가 없었을지도.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0894.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDXKo/btsMMe4HnNS/BOmlDYPWRbzSv1LHcmnmy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDXKo/btsMMe4HnNS/BOmlDYPWRbzSv1LHcmnmy0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDXKo/btsMMe4HnNS/BOmlDYPWRbzSv1LHcmnmy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDXKo%2FbtsMMe4HnNS%2FBOmlDYPWRbzSv1LHcmnmy0%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;581&quot; height=&quot;775&quot; data-filename=&quot;IMG_0894.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔 모둠 전골 같은 걸 시켜봤었는데, 국물맛이 설렁탕과 좀 다르다. 다른 육수를 쓰는 걸까. 채수맛 때문에 차이가 나는 걸까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;사실 이 집에서의 진짜는 깍두기였는데... 이런, 깍두기를 처먹느라 얼마나 정신이 없었으면 깍두기 사진이 없다. 그렇다. 오히려 너무 맛있고 너무 아름다운 것은 차마 담기도 전에 마음속에서 그리고 뱃속에서, 방금 뀐 지독한 방귀냄새처럼 강렬하다가도 재빠르게 사라지고 만다. 그렇담 나는 맛있고 아름다운 것을 기록하려 노력해야 하는 걸까 아니면 그냥 지독한 순간---그 인돌과 스카톨의 조화---를 더 즐겁게 느껴야 하는 걸까?&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 난 깍두기를 잘 안 먹는다, 깍두기가 맛있게 느껴진 건 어쩌면 나 같은 비-깍두기파에게 좀 친절한 맛이었기 때문일 것 같은데, 무의 시큼한 맛이 좀 덜했던 것 같기도 하다.&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;본구's opinion&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;li&gt;&quot;마나&quot;는 물컹한 솜 먹은 스펀지 (구멍 많은)를 씹는 식감, 소라고동 맛이 남. 비추 (취향 아님).&lt;/li&gt;
&lt;li&gt;이것저것 넣은 전골은 대전 전민동의 초명물, 한우곰탕 생각이 나는 맛이었음. 다만, 채수맛이 강하고 설렁탕보다 진하게 우러난 무언가는 없었던 듯.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>일상과 생각/일상 - 들렸던 가게들</category>
      <category>이문설농탕</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/23</guid>
      <comments>https://bayesian-bacteria.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 15 Mar 2025 12:50:36 +0900</pubDate>
    </item>
    <item>
      <title>(4.5/5.0) 밴건디 스테이크하우스</title>
      <link>https://bayesian-bacteria.tistory.com/22</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;밴건디 in a nutshell&lt;/b&gt;&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;-로칼-&lt;/b&gt;스테이크 집: 근처사는 가족단위 손님이 대부분인 편임.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;합리적인 가격&lt;/b&gt;: 울프강을 생각하다 보니, 이게 혜자라고 생각이 들어 버린다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;맛&quot;집&lt;/b&gt;: 로메인 샐러드가 매우 맛있다. 한입에 로메인 한장 가득 넣으면 죽것다. 티본스테이크의 &quot;안심&quot;이 충격이다. 맛있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rating: 4.5 / 5.0&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입구&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;밴건디2.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/moJxr/btsMli634Gb/GdjpkQ7VG2YBN9rt45z4F1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/moJxr/btsMli634Gb/GdjpkQ7VG2YBN9rt45z4F1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/moJxr/btsMli634Gb/GdjpkQ7VG2YBN9rt45z4F1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmoJxr%2FbtsMli634Gb%2FGdjpkQ7VG2YBN9rt45z4F1%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;499&quot; height=&quot;374&quot; data-filename=&quot;밴건디2.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발렛 차량을 왜 창문 옆에다 붙여두는걸까? 밖이 안보임...&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;음식, 스테이크 이전&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCwbDc/btsMkKiHUto/Bcpmkmpv4BFIbkRA8KN5V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCwbDc/btsMkKiHUto/Bcpmkmpv4BFIbkRA8KN5V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCwbDc/btsMkKiHUto/Bcpmkmpv4BFIbkRA8KN5V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCwbDc%2FbtsMkKiHUto%2FBcpmkmpv4BFIbkRA8KN5V0%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;1952&quot; height=&quot;954&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;27만 5천원짜리 2인 세트같은걸 시켰다. 스테이크 이전에 샐러드 + 파스타 하나를 선택할 수 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 로메인 시저 샐러드 + 통베이컨&lt;/b&gt;이 일종의 &quot;시그니처&quot; 인듯 한데, 로메인에 김장하듯 시저 샐러드 드레싱을 구석구석 묻히고, 치즈 그라인딩 해서 올리는듯. 로메인이 드레싱을 먹으면서 적당히 숨이 죽는데, 아, 아주 맛있다. 통베이컨도 매우 맛있음. 재밌는점은 통베이컨을 다 못먹고 남겨서 포장해갔는데, 집에서 에어프라이어로 튀기니 한 두배 더 맛있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 (한정판) 키워드가 있어서 시켰던&lt;b&gt; Bisque Gamberi 어쩌고 파스타.&lt;/b&gt; 파스타 면이 굵거나 겉이 까슬한 그런 면은 아닌것 같았다. 사실 파스타는 면이 맛있다, (갑각류) 소스가 맛있다 라기보다, 새우가 매우 탱글했다. 새우는 다먹고 면은 좀 남긴듯함.&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;스테이크&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;밴건디5.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnaeWM/btsMjB1BFOZ/QSpdKd8VPn0eYhGZb9TcJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnaeWM/btsMjB1BFOZ/QSpdKd8VPn0eYhGZb9TcJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnaeWM/btsMjB1BFOZ/QSpdKd8VPn0eYhGZb9TcJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnaeWM%2FbtsMjB1BFOZ%2FQSpdKd8VPn0eYhGZb9TcJK%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;665&quot; height=&quot;499&quot; data-filename=&quot;밴건디5.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티본 스테이크. 이게 진짜 죽음이다. 굽기는 미디움. 나는 잘 몰랐는데, 지방이 적은 부위는 좀 더 오래 굽는것이 부드러우며, 지방이 많은 부위는 좀 더 적게 굽는것이 부드럽다고 한다. 여기서 똑같이 적용하면, 안심은 조금 더 구워져야 하며 등심은 좀 덜 구워야 하나보다. 평소에 난 아무것도 모르고 미디움레어를 시키는 편인데, 어쩐지 미디움을 시키고 싶더랬다.&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;그러고, 안심을 먼저 먹으라하여 안심 한점 덜어 칼을 쑤시는순간 알았다. 이자식, 칼이 쑥 들어간다. 이녀석, 보드랍다. 아니나 다를까 뒤지게 맛있었다. 등심도 맛있었지만, 안심이 세수 (wash up 아님) 앞서있다. 여기, 소금 안준다. 그냥 스테이크 소스랑 홀그레인 머스타드를 주는데, 스테이크 시즈닝이 잘 되어있는건지 그냥 먹어도 맛있다. 그리고, 스테이크 소스가 너무,,, 자기주장이 강하지 않다. 딱 필요한 만큼만 어시스트를 주는 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgQp5i/btsMjqeKfKZ/eENDuaI94mR3ZXfYy0wxHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgQp5i/btsMjqeKfKZ/eENDuaI94mR3ZXfYy0wxHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgQp5i/btsMjqeKfKZ/eENDuaI94mR3ZXfYy0wxHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgQp5i%2FbtsMjqeKfKZ%2FeENDuaI94mR3ZXfYy0wxHk%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;676&quot; height=&quot;376&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스테이크가 나올즘에 선택 같이한 사이드메뉴를 받는데, 메쉬포테이토나 울프강의 묵은지, 시금치 (사실 시금치 죽이다. 나물 생각하면 안됨) 같은것들이다. 여기서의 사이드도 제법 맛있었는데, &amp;nbsp;&lt;b&gt;(1)&lt;/b&gt; 죽같은 시금치에 좀 향이 강한 치즈 (뭔지모르겠음) 를 버무려서 소스처럼 만들어낸 것 &lt;b&gt;(2)&lt;/b&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;칼 잘박히는 안심 하나 다시먹기 위해서라도 재방문 의사 ++.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;본구's Opinion&lt;/b&gt;&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;로메인 샐러드 먹고, 집에 로메인 따로 주문함.&lt;/li&gt;
&lt;li&gt;울프강 보다 나음.&lt;/li&gt;
&lt;li&gt;새우가 너무 탱글함.&lt;/li&gt;
&lt;/ul&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;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;밴건디.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/suSJb/btsMj9cb9hT/EaOOVoiRunhVIlOFIMqxVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/suSJb/btsMj9cb9hT/EaOOVoiRunhVIlOFIMqxVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/suSJb/btsMj9cb9hT/EaOOVoiRunhVIlOFIMqxVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsuSJb%2FbtsMj9cb9hT%2FEaOOVoiRunhVIlOFIMqxVk%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;193&quot; height=&quot;257&quot; data-filename=&quot;밴건디.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아 그리고, 솔직히 배불러서 제대로 못먹긴 했는데, 티라미수도 좀 맛있는편임. 0.8 비스테까 라고 해도 손색없음 (비스테까는 이제 폐업했다.)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;옆 테이블들은 둘이와서 저거 다 먹더라, 나도 컨디션 좋았으면 다 먹을것 같은데 아쉽. 동행자가 입이 매우 짧다. 짧은 입으로 배가 터질듯이 집어 넣었으나 역부족이었다: 덕분에 나는 항상 모든 다이닝에서 라지세트를 먹어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;스테이크하우스, 다이닝 등을 먹은 이후에는 산책은 필수다. 그대로 집에가서 누우면 토한다.&lt;/li&gt;
&lt;li&gt;여기 콜키지 되는데, 포트와인을 가져갔다. 울프강에서 포트와인을 고기랑 같이 먹었을 때 몇번 되물어보더라. '이 새끼들, 맛알못인가? 이거랑 고기랑 같이 먹는다고?' 였을까. 알빠노, 난 이게 좋다.&lt;/li&gt;
&lt;/ol&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sKSKV/btsMlF8M5H5/zFlrNcxu41kO4pX9nf0Ck1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sKSKV/btsMlF8M5H5/zFlrNcxu41kO4pX9nf0Ck1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sKSKV/btsMlF8M5H5/zFlrNcxu41kO4pX9nf0Ck1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsKSKV%2FbtsMlF8M5H5%2FzFlrNcxu41kO4pX9nf0Ck1%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;361&quot; height=&quot;481&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>일상과 생각/일상 - 들렸던 가게들</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/22</guid>
      <comments>https://bayesian-bacteria.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 16 Feb 2025 15:28:45 +0900</pubDate>
    </item>
    <item>
      <title>HiRA: parameter efficient Hadamard high rank adaptation for Large Language Models</title>
      <link>https://bayesian-bacteria.tistory.com/21</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ICLR2025&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;논문의 내용과 상관없이, 제가 이야기해보고 싶은 부분은 이탤릭체로 남깁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;texts with Italic represent parts that are not the part of the original paper, but rather my personal thoughts or additions&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Limitation of the LoRA&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LoRA and most of its variants do not perform well when applied to complex tasks&amp;mdash;such as commonsense reasoning.&lt;/li&gt;
&lt;li&gt;This degradation might be inevitable since the additional trainable parameters are &amp;ldquo;lower-rank&amp;rdquo; matrices.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Goal&lt;/b&gt;: Achieve a higher-rank adaptation for LLMs under the PEFT (parameter-efficient-fine-tune) strategy.&lt;/blockquote&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;Motivation: recap the goal of PEFT&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PEFT requires a careful &lt;b&gt;balance between model expressiveness and computational efficiency.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;Or, additionally, PEFT may help to prevent catastrophic forgetting of prior knowledge of models (&lt;a href=&quot;https://arxiv.org/abs/2405.09673&quot;&gt;https://arxiv.org/abs/2405.09673&lt;/a&gt;)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Observation 1)&lt;/b&gt; LoRA with higher ranks enhance peformance of Llama3-8B, implying&lt;b&gt; the higher-rank adapatation offer significant advantages&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;732&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ovUR/btsMcjM8Wyg/An8i25ntzizVAKQzJEXNE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ovUR/btsMcjM8Wyg/An8i25ntzizVAKQzJEXNE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ovUR/btsMcjM8Wyg/An8i25ntzizVAKQzJEXNE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ovUR%2FbtsMcjM8Wyg%2FAn8i25ntzizVAKQzJEXNE0%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;335&quot; height=&quot;344&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;752&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;However, increasing the rank in LoRA heightened computational budgets and it is difficult to train due to gradient explosion.&lt;/li&gt;
&lt;li&gt;We need an another and better tool for PEFT, but &quot;higher-ranks&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HiRA in a nutshell: LoRA vs HiRA&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAAuMc/btsMd9JbOh2/cBTSYvklwqWku4Usp2nUP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAAuMc/btsMd9JbOh2/cBTSYvklwqWku4Usp2nUP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAAuMc/btsMd9JbOh2/cBTSYvklwqWku4Usp2nUP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAAuMc%2FbtsMd9JbOh2%2FcBTSYvklwqWku4Usp2nUP0%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;1678&quot; height=&quot;808&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Above Figure 3 is about everything of HiRA: trainable low-rank matrix A, B will be elementwisely multiplied with the original weight matrix (in other words, Hadamard product)&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;i&gt;&lt;b&gt;(Q: Connection with &quot;Gated-Linear-Units&quot; (GLU)-style activation)&lt;/b&gt;: GLU activation functions has also similar structure with HiRA. $h(x) = f(x) \odot g(x)$ where $f$ and $g$ are some functions. The similar factor (Higher rank) is the main contribution of that GLUs outperforms other activations?&lt;/i&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Why HiRA outperforms LoRA?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Simply put, the LoRA has lower &quot;Rank&quot;. The property of the matrix rank is that the decompsed matrix $\Delta W = L_1 L_2$, where $L_1 \in \mathbb{R}^{d \times r}, L_2 \in \mathbb{R}^{r\times k}$ for $r &amp;lt; d, k$, has $\r$ rank. It may limit its capability to capture high-rank updates (it could be the complex tasks, such as reasoning of LLMs).&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;However, HiRA is free from such degradation due to the lower rank. HiRA utilizes the Hadamard product (element-wise product). And crucial benefit of using Hadamard product ($\odot$) is that the rank of the result matrix $P\odot Q$ is:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Rank(P \odot Q) \leq Rank(P) \times Rank(Q)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is much larger (in the most of practical scenarios) than the rank of matmul utilized by LoRA:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Rank(PQ) \leq \min(Rank(P), Rank(Q)$$&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;Above just states &lt;b&gt;upper bound&lt;/b&gt; of the rank. However, they empirically found that the Hadamard product could enhance the rank like belows:&lt;/p&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;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxA4v/btsMcfRDDZr/dm2E3fjQuyE40hZY4v469k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxA4v/btsMcfRDDZr/dm2E3fjQuyE40hZY4v469k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxA4v/btsMcfRDDZr/dm2E3fjQuyE40hZY4v469k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxA4v%2FbtsMcfRDDZr%2Fdm2E3fjQuyE40hZY4v469k%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;289&quot; height=&quot;278&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HiRA even can have higher rank than the original weight matrix&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consider below the additional weight, $\delta W$, which becomes part of the PEFT $W_{\text{new_weight}} = W_{\text{original}} + \Delta W$:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\Delta W = W_{\text{original}} \odot W_{hi}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;here, $W_{hi}$ is the NEW trainable parameter. With inequality of the above---Rank of Hadamard product---, rank of $\Delta W$ is bounded as below:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Rank(\Delta W) \leq Rank(W_{\text{original}}) \times Rank(W_{hi})$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Therefore, the rank of additional weight what we newly train possibly exceeding the rank of original matrix. And, importantly, it is still computationally efficient---equivalent to that of LoRA---if we decompose $W_{hi}$ with $W_{hi} = AB$ where $A$ and $B$ is low-rank matrices. And of course, the additional weights can be merged into the original weights just like LoRA.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Intrinsic dimensionality, expressive power: Does higher rank for finetuning make sense?&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Intrinsic dimensionality and matrix rank&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Several works have shown that LLMs have a low &lt;b&gt;intrinsic dimensionality, stating only small subsets of parameters is necessary for&lt;/b&gt; fine-tuning.&amp;nbsp;LoRA is grounded for this discovery. Contrary to this, HiRA use higher rank trainable paramater. Does it make sense?&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;The answer is yes. Intrinsic dimensionality only consider &lt;b&gt;the number of parameters&lt;/b&gt; and the small number of parameters does not inherently mandate low rank. It is not paradox.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;b&gt;(Does low number of parameters and high expressive power---In here, this was represented by rank of weights---is the key of the fine-tuning? or beyond that, is it the key of the model-design?)&lt;/b&gt; I guess not. Deep learning architectures have been developed from poor inductive bias to calibrated inductive bias. For instance, we experienced MLP to CNN: MLP has higher expressive power than CNN but function space of CNN is much more suitable for computer vision task than that of MLPs.&lt;br /&gt;&lt;br /&gt;Not sure for fine-tuning regime. Once we choice the model architecture with nice inductive bias, low number of parameters and high expressive power rules might work?&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Formal analysis of expressive power of HiRA, and the role of the original weight&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The author also give formal analysis of the expressive power of HiRA. They define the &lt;b&gt;expressive power as the minimal difference between the updated weight (the additional weight is added to the original weight) and its optimal parameter update &lt;/b&gt;(following previous &lt;a href=&quot;https://arxiv.org/pdf/2310.17513&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;work&lt;/a&gt;). The lower minimal difference to optimal value, the higher expressive power&lt;b&gt;.&lt;/b&gt; For LoRA, this is equal to the (r + 1)-th largest singular value (where r is the rank of original weight matrix).&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;With the above definition of the expressive power, it is bounded to the singluar value and &lt;b&gt;original weight (unlike LoRA, only depended on the singluar value of original weight)&lt;/b&gt;&amp;nbsp;like below:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmsFO/btsMebNNe9C/jSWjqZkNxG6owacv9G4mE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmsFO/btsMebNNe9C/jSWjqZkNxG6owacv9G4mE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmsFO/btsMebNNe9C/jSWjqZkNxG6owacv9G4mE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmsFO%2FbtsMebNNe9C%2FjSWjqZkNxG6owacv9G4mE1%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;1952&quot; height=&quot;370&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;However, the role and contribution of the pretrained weight $W_0$ is somewhat unclear. They claimed that $W_0$ serves a dual role for both confining and facilitating the adaptation. It may be due to limiting the flexibility to reduce expressive power with $\sigma_{r+1}(\bar{E} \oslash W_0)$---since it might reduce the singular value?&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Gradient analysis: gradient exploits the prior knowledge of the original weight&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Author also claimed that training HiRA surpass LoRA since it leverges the information encoded in the original weight $W_0$. This encoding might be explained by considering the gradient of lower rank matrices contains the $W_0$, unlike LoRA:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceuMyZ/btsMeuzCFd3/qw0fL79Tv2SJW7gzPkKenk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceuMyZ/btsMeuzCFd3/qw0fL79Tv2SJW7gzPkKenk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceuMyZ/btsMeuzCFd3/qw0fL79Tv2SJW7gzPkKenk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceuMyZ%2FbtsMeuzCFd3%2Fqw0fL79Tv2SJW7gzPkKenk%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;2076&quot; height=&quot;294&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;294&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;div id=&quot;WidgetFloaterPanels&quot; class=&quot;LTRStyle&quot; style=&quot;display: none; text-align: left; direction: ltr; visibility: hidden;&quot; translate=&quot;no&quot;&gt;
&lt;div id=&quot;WidgetFloater&quot; style=&quot;display: none;&quot;&gt;
&lt;div id=&quot;WidgetLogoPanel&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;TRANSLATE with &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;img id=&quot;FloaterLogo&quot; /&gt; &lt;span&gt;x&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;LanguageMenuPanel&quot;&gt;
&lt;div class=&quot;DDStyle_outer&quot;&gt;&lt;input id=&quot;LanguageMenu_svid&quot; style=&quot;display: none;&quot; autocomplete=&quot;on&quot; name=&quot;LanguageMenu_svid&quot; type=&quot;text&quot; value=&quot;en&quot; /&gt; &lt;input id=&quot;LanguageMenu_textid&quot; style=&quot;display: none;&quot; autocomplete=&quot;on&quot; name=&quot;LanguageMenu_textid&quot; type=&quot;text&quot; /&gt; &lt;span class=&quot;DDStyle&quot;&gt;English&lt;/span&gt;
&lt;div style=&quot;position: relative; text-align: left; left: 0;&quot;&gt;
&lt;div style=&quot;position: absolute; ;left: 0px;&quot;&gt;
&lt;div id=&quot;__LanguageMenu_popup&quot; class=&quot;DDStyle&quot; style=&quot;display: none;&quot;&gt;
&lt;table id=&quot;LanguageMenu&quot; border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ar&quot;&gt;Arabic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#he&quot;&gt;Hebrew&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#pl&quot;&gt;Polish&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#bg&quot;&gt;Bulgarian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#hi&quot;&gt;Hindi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#pt&quot;&gt;Portuguese&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ca&quot;&gt;Catalan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#mww&quot;&gt;Hmong Daw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ro&quot;&gt;Romanian&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#zh-CHS&quot;&gt;Chinese Simplified&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#hu&quot;&gt;Hungarian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ru&quot;&gt;Russian&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#zh-CHT&quot;&gt;Chinese Traditional&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#id&quot;&gt;Indonesian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#sk&quot;&gt;Slovak&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#cs&quot;&gt;Czech&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#it&quot;&gt;Italian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#sl&quot;&gt;Slovenian&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#da&quot;&gt;Danish&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ja&quot;&gt;Japanese&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#es&quot;&gt;Spanish&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#nl&quot;&gt;Dutch&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#tlh&quot;&gt;Klingon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#sv&quot;&gt;Swedish&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#en&quot;&gt;English&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ko&quot;&gt;Korean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#th&quot;&gt;Thai&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#et&quot;&gt;Estonian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#lv&quot;&gt;Latvian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#tr&quot;&gt;Turkish&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#fi&quot;&gt;Finnish&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#lt&quot;&gt;Lithuanian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#uk&quot;&gt;Ukrainian&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#fr&quot;&gt;French&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ms&quot;&gt;Malay&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ur&quot;&gt;Urdu&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#de&quot;&gt;German&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#mt&quot;&gt;Maltese&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#vi&quot;&gt;Vietnamese&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#el&quot;&gt;Greek&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#no&quot;&gt;Norwegian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#cy&quot;&gt;Welsh&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#ht&quot;&gt;Haitian Creole&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a tabindex=&quot;-1&quot; href=&quot;#fa&quot;&gt;Persian&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img style=&quot;height: 7px; width: 17px; border-width: 0px; left: 20px;&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt; var LanguageMenu; var LanguageMenu_keys=[&quot;ar&quot;,&quot;bg&quot;,&quot;ca&quot;,&quot;zh-CHS&quot;,&quot;zh-CHT&quot;,&quot;cs&quot;,&quot;da&quot;,&quot;nl&quot;,&quot;en&quot;,&quot;et&quot;,&quot;fi&quot;,&quot;fr&quot;,&quot;de&quot;,&quot;el&quot;,&quot;ht&quot;,&quot;he&quot;,&quot;hi&quot;,&quot;mww&quot;,&quot;hu&quot;,&quot;id&quot;,&quot;it&quot;,&quot;ja&quot;,&quot;tlh&quot;,&quot;ko&quot;,&quot;lv&quot;,&quot;lt&quot;,&quot;ms&quot;,&quot;mt&quot;,&quot;no&quot;,&quot;fa&quot;,&quot;pl&quot;,&quot;pt&quot;,&quot;ro&quot;,&quot;ru&quot;,&quot;sk&quot;,&quot;sl&quot;,&quot;es&quot;,&quot;sv&quot;,&quot;th&quot;,&quot;tr&quot;,&quot;uk&quot;,&quot;ur&quot;,&quot;vi&quot;,&quot;cy&quot;]; var LanguageMenu_values=[&quot;Arabic&quot;,&quot;Bulgarian&quot;,&quot;Catalan&quot;,&quot;Chinese Simplified&quot;,&quot;Chinese Traditional&quot;,&quot;Czech&quot;,&quot;Danish&quot;,&quot;Dutch&quot;,&quot;English&quot;,&quot;Estonian&quot;,&quot;Finnish&quot;,&quot;French&quot;,&quot;German&quot;,&quot;Greek&quot;,&quot;Haitian Creole&quot;,&quot;Hebrew&quot;,&quot;Hindi&quot;,&quot;Hmong Daw&quot;,&quot;Hungarian&quot;,&quot;Indonesian&quot;,&quot;Italian&quot;,&quot;Japanese&quot;,&quot;Klingon&quot;,&quot;Korean&quot;,&quot;Latvian&quot;,&quot;Lithuanian&quot;,&quot;Malay&quot;,&quot;Maltese&quot;,&quot;Norwegian&quot;,&quot;Persian&quot;,&quot;Polish&quot;,&quot;Portuguese&quot;,&quot;Romanian&quot;,&quot;Russian&quot;,&quot;Slovak&quot;,&quot;Slovenian&quot;,&quot;Spanish&quot;,&quot;Swedish&quot;,&quot;Thai&quot;,&quot;Turkish&quot;,&quot;Ukrainian&quot;,&quot;Urdu&quot;,&quot;Vietnamese&quot;,&quot;Welsh&quot;]; var LanguageMenu_callback=function(){ }; var LanguageMenu_popupid='__LanguageMenu_popup'; &lt;/script&gt;
&lt;/div&gt;
&lt;div id=&quot;CTFLinksPanel&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;a id=&quot;HelpLink&quot; title=&quot;Help&quot; href=&quot;https://go.microsoft.com/?linkid=9722454&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img id=&quot;HelpImg&quot; /&gt;&lt;/a&gt; &lt;a id=&quot;EmbedLink&quot; title=&quot;Get this widget for your own site&quot;&gt;&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;img id=&quot;EmbedImg&quot; /&gt;&lt;img id=&quot;ShareImg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;FloaterProgressBar&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;WidgetFloaterCollapsed&quot; style=&quot;display: none;&quot;&gt;&lt;span&gt;TRANSLATE with &lt;/span&gt;&lt;img id=&quot;CollapsedLogoImg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;FloaterSharePanel&quot; style=&quot;display: none;&quot;&gt;
&lt;div id=&quot;ShareTextDiv&quot;&gt;&lt;span&gt; COPY THE URL BELOW &lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;ShareTextboxDiv&quot;&gt;&lt;input id=&quot;ShareTextbox&quot; name=&quot;ShareTextbox&quot; readonly=&quot;readonly&quot; type=&quot;text&quot; /&gt; &lt;!--a id=&quot;TwitterLink&quot; title=&quot;Share on Twitter&quot;&gt; &lt;img id=&quot;TwitterImg&quot; /&gt;&lt;/a&gt; &lt;a-- id=&quot;FacebookLink&quot; title=&quot;Share on Facebook&quot;&gt; &lt;img id=&quot;FacebookImg&quot; /&gt;&lt;/a--&gt; &lt;a id=&quot;EmailLink&quot; title=&quot;Email this translation&quot;&gt;&lt;/a&gt; &lt;img id=&quot;EmailImg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;ShareFooter&quot;&gt;&lt;img id=&quot;ShareHelpImg&quot; /&gt; &lt;span&gt;&lt;a id=&quot;ShareBack&quot; title=&quot;Back To Translation&quot;&gt;&lt;/a&gt; Back&lt;/span&gt;&lt;/div&gt;
&lt;input id=&quot;EmailSubject&quot; name=&quot;EmailSubject&quot; type=&quot;hidden&quot; value=&quot;Check out this page in {0} translated from {1}&quot; /&gt; &lt;input id=&quot;EmailBody&quot; name=&quot;EmailBody&quot; type=&quot;hidden&quot; value=&quot;Translated: {0}%0d%0aOriginal: {1}%0d%0a%0d%0aAutomatic translation powered by Microsoft&amp;reg; Translator%0d%0ahttp://www.bing.com/translator?ref=MSTWidget&quot; /&gt; &lt;input id=&quot;ShareHelpText&quot; type=&quot;hidden&quot; value=&quot;This link allows visitors to launch this page and automatically translate it to {0}.&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;FloaterEmbed&quot; style=&quot;display: none;&quot;&gt;
&lt;div id=&quot;EmbedTextDiv&quot;&gt;&lt;span&gt;EMBED THE SNIPPET BELOW IN YOUR SITE&lt;/span&gt; &lt;a id=&quot;EmbedHelpLink&quot; title=&quot;Copy this code and place it into your HTML.&quot;&gt;&lt;/a&gt; &lt;img id=&quot;EmbedHelpImg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;EmbedTextboxDiv&quot;&gt;&lt;input id=&quot;EmbedSnippetTextBox&quot; name=&quot;EmbedSnippetTextBox&quot; readonly=&quot;readonly&quot; type=&quot;text&quot; value=&quot;&amp;lt;div id='MicrosoftTranslatorWidget' class='Dark' style='color:white;background-color:#555555'&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;script type='text/javascript'&amp;gt;setTimeout(function(){var s=document.createElement('script');s.type='text/javascript';s.charset='UTF-8';s.src=((location &amp;amp;&amp;amp; location.href &amp;amp;&amp;amp; location.href.indexOf('https') == 0)?'https://ssl.microsofttranslator.com':'http://www.microsofttranslator.com')+'/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**&amp;amp;ctf=true&amp;amp;ui=true&amp;amp;settings=manual&amp;amp;from=en';var p=document.getElementsByTagName('head')[0]||document.documentElement;p.insertBefore(s,p.firstChild); },0);&amp;lt;/script&amp;gt;&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;EmbedNoticeDiv&quot;&gt;&lt;span&gt;Enable collaborative features and customize widget: &lt;a href=&quot;http://www.bing.com/widget/translator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Bing Webmaster Portal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;EmbedFooterDiv&quot;&gt;&lt;span&gt;&lt;a title=&quot;Back To Translation&quot;&gt;Back&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt; var intervalId = setInterval(function () { if (MtPopUpList) { LanguageMenu = new MtPopUpList(); var langMenu = document.getElementById(LanguageMenu_popupid); var origLangDiv = document.createElement(&quot;div&quot;); origLangDiv.id = &quot;OriginalLanguageDiv&quot;; origLangDiv.innerHTML = &quot;&lt;span id='OriginalTextSpan'&gt;ORIGINAL: &lt;/span&gt;&lt;span id='OriginalLanguageSpan'&gt;&lt;/span&gt;&quot;; langMenu.appendChild(origLangDiv); LanguageMenu.Init('LanguageMenu', LanguageMenu_keys, LanguageMenu_values, LanguageMenu_callback, LanguageMenu_popupid); window[&quot;LanguageMenu&quot;] = LanguageMenu; clearInterval(intervalId); } }, 1); &lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Experiments&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(1) It outperformed LoRa, DoRA, MoRA in the various task&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Especially for mathematics (GSM8K), which may be relatively requiring complex reasoning.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;1764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SOpu7/btsMemhpXEl/VWVtYSQSM9CHXMC3EnNEvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SOpu7/btsMemhpXEl/VWVtYSQSM9CHXMC3EnNEvk/img.png&quot; data-alt=&quot;Note that ConvAI2 dataset from Table 2 is for the open-domain dialogue generation evaluation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SOpu7/btsMemhpXEl/VWVtYSQSM9CHXMC3EnNEvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSOpu7%2FbtsMemhpXEl%2FVWVtYSQSM9CHXMC3EnNEvk%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;2024&quot; height=&quot;1764&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;1764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Note that ConvAI2 dataset from Table 2 is for the open-domain dialogue generation evaluation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJBTec/btsMc1FlawX/mu50vRVDnX5SGLDFgMee8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJBTec/btsMc1FlawX/mu50vRVDnX5SGLDFgMee8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJBTec/btsMc1FlawX/mu50vRVDnX5SGLDFgMee8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJBTec%2FbtsMc1FlawX%2Fmu50vRVDnX5SGLDFgMee8K%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;740&quot; height=&quot;681&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2) Singular value scales of HiRA somehow is well-matched that of Full-Fine-Tuning (FFT)&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;2000&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QYaku/btsMeusQUKg/mriuSANZJTyQkydDJE9vh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QYaku/btsMeusQUKg/mriuSANZJTyQkydDJE9vh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QYaku/btsMeusQUKg/mriuSANZJTyQkydDJE9vh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQYaku%2FbtsMeusQUKg%2FmriuSANZJTyQkydDJE9vh1%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;2000&quot; height=&quot;438&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;438&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;1996&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9N5j1/btsMd2KlUiM/scGu7AVFLnkytQcHpsOsn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9N5j1/btsMd2KlUiM/scGu7AVFLnkytQcHpsOsn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9N5j1/btsMd2KlUiM/scGu7AVFLnkytQcHpsOsn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9N5j1%2FbtsMd2KlUiM%2FscGu7AVFLnkytQcHpsOsn1%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;1996&quot; height=&quot;466&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If we consider the singular value scale (its norm of the counts of larger singular value in the weight) indicates the expressive power of the model, HiRA is in the &quot;high, but not dangerously high&quot; zone. For instance, MoRA tends to be larger singular values and their counts are also high may increase the risk of forgetting. The only small number of singular values of LoRA mainly contribute (in other words, high norm). Unlike them, HiRA has proper number of large-singular values and their norms. Well-matched with FFT supports this claim.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(3) $W_0$ may contributes the fine-tuning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;They explore the impact of different choice of $R$ in $\Delta W = R \odot W_{hi}$ (for the original choice, $R=W_0$, the pretrained weight). if the $W_0$ is replaced with $R$, the finetuning is doomed. This may highlights $W_0$ plays a key role for HiRA fine-tuning by conveying useful information from pretrained weight, as they claimed.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPRKS/btsMb1MSJEo/1q2keasEKsc7rMXire3Et0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPRKS/btsMb1MSJEo/1q2keasEKsc7rMXire3Et0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPRKS/btsMb1MSJEo/1q2keasEKsc7rMXire3Et0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPRKS%2FbtsMb1MSJEo%2F1q2keasEKsc7rMXire3Et0%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;1998&quot; height=&quot;396&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(4) HiRA works best to apply for both fully-connected layers and QKV of transformers.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uKBzj/btsMdIekGZL/uDNiyApkzrMCz579J5GSX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uKBzj/btsMdIekGZL/uDNiyApkzrMCz579J5GSX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uKBzj/btsMdIekGZL/uDNiyApkzrMCz579J5GSX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuKBzj%2FbtsMdIekGZL%2FuDNiyApkzrMCz579J5GSX1%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;1912&quot; height=&quot;594&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(Q) LoRA has same tendency or not?&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(5) Interestingly, hybrid approach (LoRA + HiRA) works&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzUQjP/btsMcTnmY0h/zGQk9Vb2W5U9OkLbfB8GH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzUQjP/btsMcTnmY0h/zGQk9Vb2W5U9OkLbfB8GH1/img.png&quot; data-alt=&quot;$r_1$: rank of HiRA, $r_2$: rank of LoRA&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzUQjP/btsMcTnmY0h/zGQk9Vb2W5U9OkLbfB8GH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzUQjP%2FbtsMcTnmY0h%2FzGQk9Vb2W5U9OkLbfB8GH1%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;1986&quot; height=&quot;696&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;$r_1$: rank of HiRA, $r_2$: rank of LoRA&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authors also demonstrates usefulness of &amp;nbsp;LoRA + HiRA: $W_0\odot A_{hira}B_{hira} + A_{lora}B_{lora}$ is added into the original pretrained weight $W_0$. Furthermore, they claimed that table 6 shows that the higher rank of HiRA is preferable over LoRA since higher $r_1$ achieve the best score.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;On the &quot;forget-less&quot; benefit&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Recently, &lt;a href=&quot;https://arxiv.org/abs/2405.09673&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Biderman et al., 2024)&lt;/a&gt; have shown that although &lt;b&gt;LoRA fine-tuning underperform full-finetuning, it is better maintaining the performance of base model on tasks outside of the target domain&lt;/b&gt;. It suggests that there is a tradeoff between preserving original information of the pretrained model (or, knowledge of it) and adaptation of the target task.&amp;nbsp;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;The below figure from the Biderman's paper is a proper example to show such tradeoffs. Y axis represents the target task the model newly learns, and the X axis represents the other tasks that pre-trained model already learned.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR4ovC/btsMdKXG2uQ/7ool6xkYHFUd7ABccc1dS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR4ovC/btsMdKXG2uQ/7ool6xkYHFUd7ABccc1dS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR4ovC/btsMdKXG2uQ/7ool6xkYHFUd7ABccc1dS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR4ovC%2FbtsMdKXG2uQ%2F7ool6xkYHFUd7ABccc1dS1%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;745&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Full-fine tuning and higher rank of LoRA can achieve the higher accuracy on the target task, but they sacrifice the prior knowledge of the pre-trained weight (HellaSwag, ARC-challenge, WinoGrande here). &lt;span style=&quot;color: #404040; text-align: start;&quot;&gt;&lt;b&gt;If so, a question naturally arises: Can HiRA achieve a better Pareto front for the forgetting-adaptation trade-off?&lt;/b&gt; If it can, I believe this would be another significant contribution of HiRA. If it can not, it still has the benefits to acquire full-finetuning-level expressive power despite of its computational-efficiency. Exploring LoRA-level-efficienchy and full-finetuning-level-expressive-power methods for the forgetting-adaptation trade-off could be valuable research direction.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>Showing off studying ML/ML - 특집</category>
      <category>finetuning</category>
      <category>LLM</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/21</guid>
      <comments>https://bayesian-bacteria.tistory.com/21#entry21comment</comments>
      <pubDate>Tue, 11 Feb 2025 11:36:56 +0900</pubDate>
    </item>
    <item>
      <title>Design patterns for machine learning in a nutshell (1): Creational Design Pattern</title>
      <link>https://bayesian-bacteria.tistory.com/20</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Creational design patterns and their motivation&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Creational design pattern&lt;/b&gt;: Instance 생성과 관련된 패턴. 어떤 Instance를 효율적으로 생성하고 관리할 수 있게 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;Creational pattern은 위 처럼 &lt;b&gt;instance 생성&lt;/b&gt;이라는 목적으로 만들어진 것들이다.&lt;span&gt; 그렇다면, 모델 학습 파이프라인 등을 구성하는데에는 어떠한 예시가 있을 수 있을까? Instance 생성이 효과적이고, 직관적으로 되는 케이스가 어떤 것들이 있을까?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;HuggingFace의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;AutoModel&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;&amp;nbsp;같은 경우를 생각해 보자. 이는 (End-user의 입장에서) 모델 instance를 생성하는 데에 굉장히 편리한 역할을 한다:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;AutoModel.from_pretrained. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;혹은, 어떤 object를 생성하는데에 이것저것 복잡한 로직이 들어간다고 생각해 보자. torch.nn.Module instance를 만들기 전에 configuration을 파싱 하고, accelerate, deep-speed를 쓸 건지, Single-gpu를 쓸 건지 따위의 것들이 들어가거나, Dataloader instance를 만들기 전에 필요한 몇 가지 로직이 있는 경우가 있겠다. 혹은 새로운 데이터로더 로직을 작성하려고 하는데, 기존에 존재하는 코드를 수정하면서 작성하고 싶지 않은 상황이 있을 수 있겠다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;이 포스팅 에서는, ML 학습을 주로 예시로 들어서 몇 가지 creational pattern들을 설명한다. 전통적으로 사용되어 온 패턴들을 소개하고, 중간중간 Huggingface 등에서 보이는 같은 목적을 가진 modern-pattern 들도 다룬다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Patterns&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Factory Patterns&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 클래스들의 instance를 생성하는 목적을 가진 패턴. 특정 학습방법론을 실험하는데, 여러 architecture 에서 모두 잘 working 하는지를 보고 싶다고 생각해 보자. 다른 모든 logic에 대한 코드는 같고, model을 불러오는 부분만 다르다고 할 때, naive 하게는 분기로써 아래와 같이 구현할 수 있겠다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;def create_model(model_type):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if model_type == &quot;CNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Conv2d(3, 16, kernel_size=3, padding=1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.ReLU(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.MaxPool2d(2, 2),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Conv2d(16, 32, kernel_size=3, padding=1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.ReLU(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.MaxPool2d(2, 2),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Flatten(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Linear(32 * 8 * 8, 10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;RNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.RNN(input_size=10, hidden_size=20, num_layers=2, batch_first=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;Transformer&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Transformer(d_model=512, nhead=8, num_encoder_layers=6)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise ValueError(&quot;Unknown model type&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;Factory Pattern은 위처럼 학습을 하는 Main code에서, 이런 분기를 타는 create_model을 만들지 말고, ModelFactory 라는 별도의 클래스가 모델 인스턴스 생성을 하도록 만들어보자. 아래와 같이, 여러 종류의 instance를 만들 수 있는 하나의 class를 가지는것을 &lt;b&gt;Simple factory pattern&lt;/b&gt; 이라한다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class ModelFactory:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self, model_type: str, some_complex_config: SomeConfig):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if model_type == &quot;CNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CNNModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;RNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return RNNModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;Transformer&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return TransformerModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise ValueError(&quot;Unknown model type&quot;)

class CNNModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training CNN model...&quot;)

class RNNModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training RNN model...&quot;)

class TransformerModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training Transformer model...&quot;)

factory = ModelFactory()
model = factory.create_model(&quot;CNN&quot;, some_complex_configuration)
model.train()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;하지만, 이는 여전히 팩토리 클래스 내부적으로는 -분기-를 기반으로 하고있다. 더 나은 해결책으로는, 아래처럼 모델마다 모델 생성 팩토리를 만들 수 있겠다. 이러한 패턴은 &lt;b&gt;Factory method pattern&lt;/b&gt; 이라 불리운다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod
import torch.nn as nn

class ModelFactory(ABC):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@abstractmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass

class CNNFactory(ModelFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(...)

class RNNFactory(ModelFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(nn.RNN(input_size=10, hidden_size=20, num_layers=2, batch_first=True))

class TransformerFactory(ModelFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Transformer(d_model=512, nhead=8, num_encoder_layers=6)

def get_model(factory: ModelFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model = factory.create_model()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return model

cnn_factory = CNNFactory()
cnn_model = get_model(cnn_factory)
print(&quot;CNN Model:&quot;, cnn_model)

rnn_factory = RNNFactory()
rnn_model = get_model(rnn_factory)
print(&quot;RNN Model:&quot;, rnn_model)

transformer_factory = TransformerFactory()
transformer_model = get_model(transformer_factory)
print(&quot;Transformer Model:&quot;, transformer_model)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;이제, 새로운 모델이 생길때마다 분기를 만드는 짓을 하지 않아도 된다. 그런데, 얼핏 보면, 새로운 모델을 추가할 때마다 새로운 무언가를 추가해야 하는 건 팩토리를 만드나 안 만드나 똑같고 (해당하는 팩토리 클래스를 만들어야 하니까), 복잡성만 증가한 것이 아닌가 생각되기도 한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;실제로는, 이렇게 분리하게 되면 아래와 같은 몇 장점이 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 모델을 추가 할 때, 완전히 별도의 Factory class에서 진행하게 되면 기존 코드를 잘 못 건드릴 일이 없다. 즉, 안정성이 증가한다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;Open/Closed Pricinciple (OCP) 준수&lt;/b&gt;&lt;/u&gt;: 즉, 기존 코드를 전혀 수정하지 않고 새로운 기능을 확장할 수 있다. &lt;b&gt;내가 구현하려는 새로운 모델의 클래스에 대해서만 구현에 신경을 쓰면 되는 것이다.&lt;/b&gt; 기존의 Interface (Base Class or Abstract class of the factory)를 수정하지 않아도 된다. (혹은, 않아야 한다!)&lt;/li&gt;
&lt;li&gt;동일 인터페이스를 따를 수 밖에 없기 때문에 (ModelFactory), 코드에 일관된 패턴을 강제할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;working with the classmethod: AutoClass&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 의미의 Factory 패턴은 아니지만, 비슷한 목적을 가지지만 Python의 유연성을 활용한 디자인을 한번 알아보자. Python의 classmethod를 이용해서, Factory패턴과 유사한 목적-인스턴스 생성-을 위해 마치 Huggingface의 AutoClass처럼 사용할 수도 있다:&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class AutoModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(cls, model_type):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if model_type == &quot;CNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CNNModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;RNN&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return RNNModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif model_type == &quot;Transformer&quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return TransformerModel()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise ValueError(&quot;Unknown model type&quot;)

...

model = AutoModel.create_model(&quot;CNN&quot;)
model.train()&amp;nbsp;&amp;nbsp;# Output: Training CNN model...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;여전히 분기가 거슬린다고하면, HF에서 처럼 Model-registery를 활용해서 해당 분기를 없애고, 모델을 추가할 때 아예 별도의 Factory를 만들 필요도 없게 만들 수도 있다! 각 모델의 팩토리를 만드는 것이 아니고, 그냥 Class decorator를 추가하기만 하면 된다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class AutoModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_registry = {}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def register_model(cls, model_type: str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def inner_wrapper(wrapped_class):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cls._registry[model_type] = wrapped_class
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return wrapped_class
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return inner_wrapper

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def from_type(cls, model_type: str, some_complex_config):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if model_type not in cls._registry:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise ValueError(f&quot;Unknown model type: {model_type}&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cls._registry[model_type](some_complex_config)

@AutoModel.register_model(&quot;CNN&quot;)
class CNNModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, config):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Initializing CNN model with config:&quot;, config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training CNN model...&quot;)

@AutoModel.register_model(&quot;RNN&quot;)
class RNNModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, config):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Initializing RNN model with config:&quot;, config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training RNN model...&quot;)

@AutoModel.register_model(&quot;Transformer&quot;)
class TransformerModel:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, config):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Initializing Transformer model with config:&quot;, config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training Transformer model...&quot;)

model = AutoModel.from_type(&quot;CNN&quot;, some_complex_configuration)
model.train()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;이는 원래의 Factory pattern의 장점인 OCP, 객체의 생성과 클래스 기능의 분리가 없다. 하지만, 코드가 간결해지고 '라이브러리 구조' 에 적합하다. 즉, End-user는 아묻따 AutoSomething.give_my_instance 만 하면 되는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Abstract Factory Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름에서 알 수 있듯, Factory Pattern처럼 &quot;instance를 생성하는 기능&quot;을 하는 클래스를 가지는 패턴이다. 다만, Abstract Factory Class에서는 instance들을 생성한다. ML 학습을 예시로 들면, 어떤 Class가 데이터로더, 모델, 학습루프 (trainer)와 관련된 instance를 모조리 생성하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다양한 실험 환경 구성을 한다고 해보자. Abstract Factory Pattern을 사용하면 아마 아래와 같이 구현할 수 있을 것이다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod
import torch
import torch.nn as nn
import torch.optim as optim

# Abstract Factory
class ExperimentFactory(ABC):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@abstractmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@abstractmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_data_loader(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@abstractmethod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_trainer(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass

class CNNExperimentFactory(ExperimentFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Conv2d(3, 16, kernel_size=3, padding=1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.ReLU(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.MaxPool2d(2, 2),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Conv2d(16, 32, kernel_size=3, padding=1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.ReLU(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.MaxPool2d(2, 2),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Flatten(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nn.Linear(32 * 8 * 8, 10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_data_loader(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return torch.utils.data.DataLoader(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;torch.randn(100, 3, 32, 32), batch_size=32, shuffle=True)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_trainer(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return Trainer(self.create_model(), self.create_data_loader())

class RNNExperimentFactory(ExperimentFactory):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_model(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.RNN(input_size=10, hidden_size=20, num_layers=2, batch_first=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_data_loader(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return torch.utils.data.DataLoader(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;torch.randn(100, 10, 10), batch_size=32, shuffle=True)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def create_trainer(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return Trainer(self.create_model(), self.create_data_loader())

class Trainer:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, model, data_loader):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.model = model
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.data_loader = data_loader
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.optimizer = optim.SGD(model.parameters(), lr=0.01)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def train_loop(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;Starting training with {self.model.__class__.__name__}&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for epoch in range(N): 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for data in self.data_loader:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outputs = self.model(data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loss.backward()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.optimizer.step()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.optimizer.zero_grad()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Training completed.&quot;)

cnn_factory = CNNExperimentFactory()
cnn_trainer = cnn_factory.create_trainer()
cnn_trainer.train_loop()

print(&quot;\n---\n&quot;)

rnn_factory = RNNExperimentFactory()
rnn_trainer = rnn_factory.create_trainer()
rnn_trainer.train_loop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;위에서는 create_data_loader가 단순히 DataLoader class가 들어갔지만, 실제로는 Dataloader의 Factory가 들어갈 수 있겠다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이렇게 하면, Trainer 같은 공통 로직을 재사용할 수 있고, 확장성이 좋아진다. 즉, 새로운 모델과 데이터로 실험을 한다고 할 때, 기존 코드를 손대지 않고 (즉, 기존 코드에 문제가 발생할 일은 없다.) 새로운 ExperimentFactory만 추가하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Singleton Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 클래스가 단 하나의 instance만 가지도록 강제&lt;/b&gt;하는 패턴. &lt;b&gt;무언가 공유되어야 하는 리소스 (log, gpu resource) 등을 다룰 때 유용&lt;/b&gt;하다. 예를 들어, torch로 학습을 할 때는 cpu, cuda:0 등의 device 설정을 model.to(device)로 해 줄 때가 종종 있고, 이런 Device는 모든 code에 걸쳐 동일해야 한다 (하나의 Device setting을 가져야 한다).&lt;br /&gt;Accelerate 등을 사용하지 않는다면 말이다. 아래의 예시처럼 구현할 수 있다:&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import torch

class DeviceManager:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_instance = None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __new__(cls):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if cls._instance is None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;Initializing Device Manager...&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cls._instance = super(DeviceManager, cls).__new__(cls)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cls._instance.device = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cls._instance

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def get_device(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.device

device_manager1 = DeviceManager()
print(&quot;Device:&quot;, device_manager1.get_device())&amp;nbsp;&amp;nbsp;# cuda or cpu

device_manager2 = DeviceManager()
print(&quot;Device:&quot;, device_manager2.get_device()) 

print(device_manager1 is device_manager2)&amp;nbsp;&amp;nbsp;# True, since two different device_managers share the instance&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Surpassing global variable&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, Singleton Pattern이 Global variable과 유사하다고 생각될 수 있다.&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;하지만 Singleton pattern은 global variable로 하나의 값을 관리하는 것에 비해 장점이 몇가지 있다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Singleton object는 &quot;필요할 때만 초기화&quot; 할 수 있고 (gpu 여부를 항상 체크하지 않아도 될 수 있다)&lt;/li&gt;
&lt;li&gt;관련 설정을 더 추가하고 싶을 때 용이하며 ( 특정 파라미터 수 미만의 모델은 CPU로 돌리고 싶거나, config를 받아서 testing일 때는 CPU로 돌리거나&lt;/li&gt;
&lt;li&gt;global variable과 달리 mocking이 용이해서 테스트가 더 쉬워진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Builder Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tensor Flow나 torch의 Sequential을 생각하면 쉽다. 복잡한 instance를 여러 단계로 구성할 때 사용된다. 가장 간단한 예시는 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import torch.nn as nn

class CNNModelBuilder:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.layers = []

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def add_conv_layer(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.layers.append(nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def add_relu(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.layers.append(nn.ReLU())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def add_max_pool(self, kernel_size, stride):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.layers.append(nn.MaxPool2d(kernel_size, stride))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def add_fc_layer(self, in_features, out_features):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.layers.append(nn.Linear(in_features, out_features))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def build(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nn.Sequential(*self.layers)

builder = CNNModelBuilder()
model = (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.add_conv_layer(3, 16, 3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_relu()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_max_pool(2, 2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_conv_layer(16, 32, 3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_relu()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_max_pool(2, 2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .add_fc_layer(32 * 6 * 6, 10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build()
)

print(model)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;실제로는, 2020년도 초반에 ML research를 하면 항상 볼 수 있던 ResNet &lt;a href=&quot;https://github.com/kuangliu/pytorch-cifar/blob/master/models/resnet.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;code block&lt;/span&gt;&lt;/a&gt;에서 이러한 로직을 많이 사용한다. 다만, 실제로 ML프로젝트에 class로써 builder pattern 적용된 케이스는 많지 않은 듯하다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/20</guid>
      <comments>https://bayesian-bacteria.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 31 Oct 2024 14:19:24 +0900</pubDate>
    </item>
    <item>
      <title>Extracting a secret sauce from Meta MovieGen</title>
      <link>https://bayesian-bacteria.tistory.com/19</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Intro&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Modern foundation models for image and video generation are often closed-source, with many technical details remaining unavailable to the public&amp;mdash;this is especially true for video generation models.&amp;nbsp;&lt;i&gt;(In my view, this closed-source trend is even more pronounced than in the LLM domain.)&lt;/i&gt;. For example, we know very little, if anything, about the technical specifics behind models like Runway Gen3, LumaLabs, or OpenAI&amp;rsquo;s Sora. However, thanks to the Meta MovieGen team, a detailed technical report on their work has been made publicly available. In this article, I won&amp;rsquo;t focus on MovieGen itself, but rather on the know-how it provides: we will explore their recipes for designing and training video (and image) generation models.&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;Following the structure of the original paper, we will explore &lt;b&gt;(1)&lt;/b&gt; their design choices, including architecture, loss functions, and others; &lt;b&gt;(2)&lt;/b&gt; dataset construction; &lt;b&gt;(3)&lt;/b&gt; training methods, such as training stages and parallelism; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;and finally&lt;/span&gt;&lt;b&gt;(4)&lt;/b&gt; inference techniques. Each &amp;lsquo;recipe&amp;rsquo; contains only the bullet points, with details excluded for simplicity. The aim is to provide a high-level overview of the key aspects without diving into technical specifics.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Design choices: architecture, loss-functions, and others&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Common&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Use flow-matching (ensure &quot;zero terminal SNR&quot;---pure-gaussian noise input is trained), the rising star, (maybe) better alternatives of Diffusion.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;use $\sigma_{min}=1e^{-5}$, not zero unlike SD3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Temporal VAE&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Use Spatio-temporal autoencoder, initialized by spatial (commonly-used) VAE
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jointly train them. in a ratio of 1 batch of images to 3 batches of videos.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;More channels in a latent space&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;impose &quot;Outlier penalty loss&quot; -&amp;gt; to remove &quot;&lt;a href=&quot;https://bayesian-bacteria.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;high-norm&lt;/a&gt;&quot; meaningless pixels of decoded image.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(Opinion) This can be replaced with the &lt;a href=&quot;https://arxiv.org/abs/2309.16588&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;register tokens&lt;/a&gt; which aims to alleviate &quot;high-norm&quot; tokens of the vision transformer. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;a href=&quot;https://huggingface.co/docs/diffusers/v0.30.0/en/api/models/autoencoderkl#diffusers.AutoencoderKL.tiled_encode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tilling&lt;/a&gt; for efficient inference&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;train with variable length of videos&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Main transformer backbone architecture&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;i&gt;On their philosophy for the architecture design:&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&quot;We intentionally keep the design of our backbone simple and similar to LLMs, specifically LLaMa3. This design choice allows us scale the model size and training, as discussed in ...&quot;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Guess&lt;/b&gt;: they might want to leverage their infrastructure and AI-framework, optimized to the LLaMa-family, rather than exploring the T2I or T2V suitable architecture.&amp;nbsp;&lt;br /&gt;- Furthermore, they found that their simple architecture works better than specialized blocks while being more stable to train.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1fepg/btsJ8qagBjq/dxosZNZhyOKwxK4bEAKsz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1fepg/btsJ8qagBjq/dxosZNZhyOKwxK4bEAKsz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1fepg/btsJ8qagBjq/dxosZNZhyOKwxK4bEAKsz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1fepg%2FbtsJ8qagBjq%2FdxosZNZhyOKwxK4bEAKsz0%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;975&quot; height=&quot;614&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;614&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;patching via 3D conv, but not compress temporal dimension (like OpenSora or others)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;learnable positional embedding for arbitrary size, aspect ratio and video length&lt;/b&gt; (from the NeurIPS2024-submitted architecture &lt;a href=&quot;https://arxiv.org/pdf/2307.06304&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;NaViT&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;LLama3-like transformer architecture: RMSNorm, SwiGLU
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cross-attention for text conditioning&lt;/li&gt;
&lt;li&gt;use multiple text encoders (rationale of the text-encoders are interesting)&lt;/li&gt;
&lt;li&gt;Not causal attention unlike original LLama3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Text encoder choice and its &lt;span style=&quot;color: #781b33;&quot;&gt;rationale&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Use 3 encoders: UL2, ByT5, and MetaCLIP. Interestingly, their model-choice has specific reasons.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MetaCLIP&lt;/b&gt; is obtained by finetuning the CLIP to increase token-length 77 to 256. MetaCLIP is specialized in &lt;b&gt;&quot;text-image-alignment&quot;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ByT5&lt;/b&gt; is byte-level text-encoder. Therefore, it is specialized in supporting &quot;&lt;b&gt;generating characters&lt;/b&gt;&quot;. (e.g. the prompt &lt;i&gt;A developer holding a sign that says 'I need a job'&lt;/i&gt;)&lt;/li&gt;
&lt;li&gt;UL2 is for &lt;b&gt;long-sentence understanding&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(&lt;b&gt;FPS controling with input text&lt;/b&gt;) they control the FPS (Frame-per-second) of the video with the input text prompt: during pre-training, the text prompt includes &quot;FPS-16&quot;, &quot;FPS-XX&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Spatial upsampling&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOvbs4/btsJ8K7s5j2/VFHFyVLTaDYlFOCFHbpQT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOvbs4/btsJ8K7s5j2/VFHFyVLTaDYlFOCFHbpQT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOvbs4/btsJ8K7s5j2/VFHFyVLTaDYlFOCFHbpQT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOvbs4%2FbtsJ8K7s5j2%2FVFHFyVLTaDYlFOCFHbpQT0%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;967&quot; height=&quot;339&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;339&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;Train a new super-resolution transformer, but smaller one (e.g. original: 30B, here: 7B)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;transformer trained with only spatial computation (there is no temporal-attention)&lt;/li&gt;
&lt;li&gt;input channel is doubled, due to low-resolution frame inputs.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Improving temporal consistency with Multi-Diffusion, not with&lt;/b&gt; &lt;b&gt;temporal-attention) &lt;/b&gt;they utilize the &lt;a href=&quot;https://arxiv.org/pdf/2302.08113&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Multi-Diffusion&lt;/a&gt; (training-free, applied at inference time) to ensure consistency between upsampled-frames.&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;963&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rlccs/btsKafk4IIY/FhVCC3CF6kx5xnwjXSeAK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rlccs/btsKafk4IIY/FhVCC3CF6kx5xnwjXSeAK1/img.png&quot; data-alt=&quot;As mentioned above, flow-matching and the simple architecture with LLaMa3-like contributes the quality of the video according to the ablation study..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rlccs/btsKafk4IIY/FhVCC3CF6kx5xnwjXSeAK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frlccs%2FbtsKafk4IIY%2FFhVCC3CF6kx5xnwjXSeAK1%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;963&quot; height=&quot;186&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;As mentioned above, flow-matching and the simple architecture with LLaMa3-like contributes the quality of the video according to the ablation study..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;Dataset&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fri3w/btsJ8I2TOVE/n1tLAiv3lXvNfsdiZcGm9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fri3w/btsJ8I2TOVE/n1tLAiv3lXvNfsdiZcGm9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fri3w/btsJ8I2TOVE/n1tLAiv3lXvNfsdiZcGm9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFri3w%2FbtsJ8I2TOVE%2Fn1tLAiv3lXvNfsdiZcGm9k%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;969&quot; height=&quot;254&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;254&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;they use a lot of visual filtering, like above.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;they even&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;remove videos with excessive text with a video OCR model. why?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;scene boundary detection is done by FFmpeg&lt;/li&gt;
&lt;li&gt;with aspect ratio filtering, they achieve a mix of 60% landscape and 40% portrait videos&lt;/li&gt;
&lt;li&gt;remove first few seconds of clips which usually contain unstalble camera movement or transition effects&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;they filter out low motion videos&lt;/li&gt;
&lt;li&gt;&lt;b&gt;remove &quot;perceptually duplicate clips&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;via similarity in a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://arxiv.org/abs/2202.10261&quot;&gt;copy-detection embedding space&amp;nbsp;&lt;/a&gt;(feature space specialized in de-duplication)&lt;/li&gt;
&lt;li&gt;of course, as like many other text-to-something model development, they generate synthetic captions.&lt;/li&gt;
&lt;li&gt;at least&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;60%&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of their high-resolution training set&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;contains humans&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;bucketing their training dataset by different aspect ratios and video durations (5 buckets)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Training&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Towards model scaling and training efficiency&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;they have well-organized, optimized, scaled architecture. yes.&lt;/li&gt;
&lt;li&gt;use vanilla Multi-head-attention, not use Grouped-Query-Attention since the video generation does not need a merit of it: auto-regressive generation with causal mask.&lt;/li&gt;
&lt;li&gt;like other video model training, multi-stage training is used: stage 1 for image-only training, stage 2 for low-resolution videos, stage 3 for high-resolution videos...
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the majority of training budget is long-context high-resolution video training.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;On the parallelism&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;- they use complex multiple parallelism for efficient training : Tensor-parallelism, sequence-parallelism, context-paralleism, fully-sharded data parallel&lt;br /&gt;- the fundamental aim of using different parallelism for each transformer components is &lt;b&gt;reducing communication of machines&lt;br /&gt;&lt;/b&gt;- for instance, layer-norm treats sequence dimension independently. So, apply the sequence parallelism.&amp;nbsp;&lt;br /&gt;- they have done this with just &quot;pytorch&quot; and compiled into CUDAGraphs not with DeepSpeed or others. &lt;b&gt;How?&lt;/b&gt;&lt;/blockquote&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;&lt;b&gt;(Dataset 1)&lt;/b&gt; they focus on balancing the concepts in set of videos from their fine-tuning dataset.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;it is done by deduplication with k-NN on text feature space.&lt;/li&gt;
&lt;li&gt;the details of dataset pipeline is described at &quot;Dataset&quot; in this article.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Dataset 2)&lt;/b&gt; they &lt;i&gt;&lt;b&gt;manually&lt;/b&gt;&lt;/i&gt; identify cinematic videos and again &lt;i&gt;&lt;b&gt;manually&lt;/b&gt;&lt;/i&gt; caption the videos for subset of high-quality video data&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Model averaging)&lt;/b&gt; they average model checkpoints obtained from SFT experiments that use various version of finetune data, hyperparameters and pre-train checkpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;Comments on model averaging&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Model averaging has a rich history in improving generalization in machine learning.&amp;nbsp;For instance, &lt;a href=&quot;https://arxiv.org/abs/1803.05407&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SWA(Stochastic weight averaging)&lt;/a&gt;,&lt;a href=&quot;https://arxiv.org/abs/1412.6980&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; EMA(Exponential moving average, with Adam)&lt;/a&gt;, &lt;a href=&quot;https://arxiv.org/abs/2203.05482&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ModelSoup&lt;/a&gt;, merging LoRA weights and its &lt;a href=&quot;https://proceedings.neurips.cc/paper_files/paper/2023/file/1644c9af28ab7916874f6fd6228a9bcf-Paper-Conference.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;variants&lt;/a&gt;, and so on.&lt;br /&gt;&lt;br /&gt;In modern deep learning, some of these approaches are still actively applied: for instance, EMA in diffusion models and LoRA weight merging for large language models. MovieGen demonstrates additional possibilities for leveraging these techniques. They average the more &quot;diverse&quot; weights with different dataset, hyperparameters and even pre-train checkpoint. &lt;br /&gt;&lt;br /&gt;In ensemble and Bayesian deep learning, the diversity of the &amp;lsquo;merged&amp;rsquo; (or marginalized) models often leads to better generalization, such as models with weights in different basins of the weight space. I believe &amp;lsquo;diversity&amp;rsquo; is also a key factor in model averaging, even though the mechanism of weight averaging is not identical to that in Bayesian methods.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Learning-rate&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unlike previous public T2I report, they&amp;nbsp;consecutively adjust their learning rate.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;they reduce learning rate by half at some point, which further reduces the loss.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;decrease the learning rate whenever the validation loss plateaus&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #0e0e0e; text-align: start;&quot;&gt;This kind of &amp;lsquo;learning-rate&amp;rsquo; engineering used to be Deep Learning 101, but in modern training setups (such as LLMs and Diffusion models), it is often overlooked. It serves as a reminder of the importance of this kind of &amp;lsquo;basic engineering,&amp;rsquo; even if it seems a bit tedious.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Additionally, the validation loss of flow-matching loss is highly correlated with the quality of images or videos according to reports from StableDiffusion 3 and MovieGen.&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;&lt;b&gt;Inference&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE14xe/btsKa1M9CjB/OECQiktaEHDDaAItDwPIPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE14xe/btsKa1M9CjB/OECQiktaEHDDaAItDwPIPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE14xe/btsKa1M9CjB/OECQiktaEHDDaAItDwPIPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE14xe%2FbtsKa1M9CjB%2FOECQiktaEHDDaAItDwPIPK%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;967&quot; height=&quot;474&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;474&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;they utilize inference prompt rewrite on the input text prompt
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;finetune the another 8B LLaMa3 model specialized in the prompt rewriting, with human-in-the-loop (generate LLaMa3 70B, and select the high-quality rewrite pairs)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;they use &quot;linear-quadratic t-schedule&quot; focusing on the initial timesteps of flow-matching ODE, since the difference between model input and output is high at the initial step (they might try to balance it)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(Q) &lt;/b&gt;is this the common phenomenon of the flow-matching models?&lt;/li&gt;
&lt;li&gt;if not, we can design more suitable timestep schedule of our own model b&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;ased on creating a timestep schedule that focuses on areas with greater variation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;this linear quadratic schedule can significantly reduce the number of steps to generate high-quality videos.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;(Observation 1) they found that simple Euler ODE solver outperforms higher-order solvers.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;(Observation 2) Video generation is more sensitive to the number of inference steps compared to image generation (the higher number the more significant the improvement)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;To&lt;/b&gt; &lt;b&gt;conclude&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;We have distilled the essential components of MovieGen, focusing on its core text-to-video backbone model. While it&amp;rsquo;s clear that training such a massive video generation model is not feasible for us, even with full knowledge of its underlying mechanisms (and I believe we don&amp;rsquo;t have &lt;i&gt;all&lt;/i&gt; the details), my goal was to gain meaningful insights into the creation of text-to-something foundation models and to learn from their trial and error.&lt;/p&gt;
&lt;p style=&quot;color: #0e0e0e;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #0e0e0e;&quot; data-ke-size=&quot;size16&quot;&gt;The original technical reports provide detailed applications of the text-to-video backbone, including personalized generation, video editing through instructions, and even sound generation corresponding to the videos. For more amazing results, check out the original paper and their &lt;a href=&quot;https://www.youtube.com/playlist?list=PL86eLlsPNfyi27GSizYjinpYxp7gEl5K8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;youtube playlist&lt;/a&gt;.&lt;/p&gt;</description>
      <category>Showing off studying ML/ML - 특집</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/19</guid>
      <comments>https://bayesian-bacteria.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 17 Oct 2024 23:14:47 +0900</pubDate>
    </item>
    <item>
      <title>[Reels] LCM-Lookahead for Encoder-based Text-to-Image Personalization</title>
      <link>https://bayesian-bacteria.tistory.com/18</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(&quot;Lookahead-loss&quot;)&lt;/b&gt; During encoder training for models like IP-adaptor, they use single-pass generation models such as the Consistency model to generate noisy images, which are then compared with the reference image to compute an additional loss (LCM-lookahead loss).
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;However, the LCM model can end up optimizing the loss regardless of the input (z_rt below), which could break the alignment between the model and its intended task. To prevent this and regularize the LCM's generation capability, they randomly adjust the LoRA scale within a specific range.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Additional reference image encoding through KV value)&lt;/b&gt; The Key-Value (KV) pairs of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;noisy reference&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;image are computed (using a duplicated Denoising network) and concatenated with the KV pairs of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;target image&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(the main image we&amp;rsquo;re generating), as shown on the left side of figure 3.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The KV Encoder consists of parameters copied from the original UNet.&lt;/li&gt;
&lt;li&gt;If the KV Encoder is completely frozen, it can cause &amp;ldquo;excessive appearance transfer&amp;rdquo; or a &amp;ldquo;loss of editing capability,&amp;rdquo; so it's made trainable using LoRA (a bit unclear here).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Synthetic data generation for personalization)&lt;/b&gt; Inspired by the mode-collapse issue in SDXL-turbo (e.g., similar prompts generating very similar images&amp;mdash;leading to repeated faces, etc.), we address this by generating multiple images of the same identity, using around 500k images for this purpose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O7HoN/btsJ7zpUoyH/0M6ka1O5qTl9IkhDaEpKxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O7HoN/btsJ7zpUoyH/0M6ka1O5qTl9IkhDaEpKxk/img.png&quot; data-alt=&quot;Look-ahead loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O7HoN/btsJ7zpUoyH/0M6ka1O5qTl9IkhDaEpKxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO7HoN%2FbtsJ7zpUoyH%2F0M6ka1O5qTl9IkhDaEpKxk%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;1694&quot; height=&quot;762&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Look-ahead loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2616&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AbOoA/btsJ77ftJE7/l9PjVpmuVbjkxEZKPlN79k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AbOoA/btsJ77ftJE7/l9PjVpmuVbjkxEZKPlN79k/img.png&quot; data-alt=&quot;architecture design with KV encoder&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AbOoA/btsJ77ftJE7/l9PjVpmuVbjkxEZKPlN79k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAbOoA%2FbtsJ77ftJE7%2Fl9PjVpmuVbjkxEZKPlN79k%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;2616&quot; height=&quot;1296&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2616&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;architecture design with KV encoder&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Key Insight&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Single-pass models (consistency models, progressive distillation, or etc) distilled from the original model can be utilized to apply &amp;ldquo;&lt;b&gt;image-space loss&lt;/b&gt;&amp;rdquo;.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the distilled model and original model are &amp;ldquo;&lt;i&gt;aligned&lt;/i&gt;&amp;rdquo;: they can generate similar output with identitical prompt and initial noise.&lt;/li&gt;
&lt;li&gt;Here, the target task was the personalization but I believe it is capable of solving other task which needs the image space loss (for instance, aesthetic score)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Key-value of the noisy-reference image include the feature of the target identity.&lt;/li&gt;
&lt;li&gt;Diffusion models with discriminator (e.g. SDXL) may lead to mode-collapse and it can be useful to generate synthetic personalization data (having consistent identity).&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Showing off studying ML/ML - academic reels</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/18</guid>
      <comments>https://bayesian-bacteria.tistory.com/18#entry18comment</comments>
      <pubDate>Tue, 15 Oct 2024 21:55:11 +0900</pubDate>
    </item>
    <item>
      <title>[Reels] Imagen yourself</title>
      <link>https://bayesian-bacteria.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/pdf/2409.13346&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt; , Personalized text-to-image generation by Meta AI&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NhtW2/btsJ8b28JVA/gBMJu84oeqLAiDdFUrBdJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NhtW2/btsJ8b28JVA/gBMJu84oeqLAiDdFUrBdJK/img.png&quot; data-alt=&quot;IP-adaptor---almost the standard design choice of the tuning-free personalization---like architecture, but improved.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NhtW2/btsJ8b28JVA/gBMJu84oeqLAiDdFUrBdJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNhtW2%2FbtsJ8b28JVA%2FgBMJu84oeqLAiDdFUrBdJK%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;1630&quot; height=&quot;1174&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IP-adaptor---almost the standard design choice of the tuning-free personalization---like architecture, but improved.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Insights&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;They create &amp;ldquo;architecture tailored for personalization image generation&amp;rdquo;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;they design kind of improved IP-adaptor&lt;span&gt;&amp;nbsp;&lt;/span&gt;for &amp;ldquo;any-personality&amp;rdquo; generation.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;therefore, the model does not need to be trained for a new subject, unlike LoRA or Dreambooth.&lt;/li&gt;
&lt;li&gt;meanwhile, other &amp;ldquo;any-personality generation models&amp;rdquo; could come with a strong over-fitting behavior such as copy-paste effect to the reference image. (it can be resolved in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;synthetic pair dataset&lt;span&gt;&amp;nbsp;&lt;/span&gt;below)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Synthetic pair dataset for personalization task&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the limitation of the existing personalization task is &amp;ldquo;copy-paste&amp;rdquo; effect&amp;mdash;the generated image looks super-similar to the given reference image.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;it means that the target generated image &amp;ldquo;does not follow&amp;rdquo; the given prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;to resolve such issue, authors proposes the synthetic-data pipeline consisting of several real and synthetic data for one identity.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sadly, the details of the pipeline is not included (such as, how to generate synthetic &amp;ldquo;personalized image&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Rationale in their text encoders&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(common space between image and text)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;CLIP&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(encoding &amp;ldquo;characters&amp;rdquo;)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/2105.13626&quot;&gt;ByT5&lt;/a&gt;: Byte-Level (Character-level) T5 architecture. (might improve the &amp;ldquo;text image&amp;rdquo; generation&amp;mdash;for instance, the sign of &amp;ldquo;moreh is cool&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Comprehending long and intricate text prompts)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/pdf/2205.05131&quot;&gt;UL2&lt;/a&gt;: &amp;ldquo;improved T5&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Limitations&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;only applicable for the models with cross-attention text conditioning.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;at least, from the proposed architecture in the paper&lt;/li&gt;
&lt;li&gt;to apply SD3-like architecture (w/o cross attentions), it need to be adjusted&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Showing off studying ML/ML - academic reels</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/17</guid>
      <comments>https://bayesian-bacteria.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 15 Oct 2024 21:49:02 +0900</pubDate>
    </item>
    <item>
      <title>Vision transformers need registers</title>
      <link>https://bayesian-bacteria.tistory.com/16</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;이 포스트는 Academic-reels와 특집 어딘가에 있는... shorts는 아니지만 그렇다고 10분짜리 비디오도 아닌 그런 구성입니다. 정리본 같은 거랄까요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #c0d1e7; letter-spacing: 0px;&quot;&gt;되게 Scientific 하게 잘 쓰인 논문입니다. 점수가 매우 높아요. 흥미로운 가설을 설정했고, 가설을 support 하는 좋은 관측들을 했고, 그에 따른 simple-but-effective 한 방법을 제시합니다. 글도 매우 잘 써진 것 같고요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #c0d1e7; letter-spacing: 0px;&quot;&gt;별 5.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;FAIR, Meta, ICLR 2024 Oral&lt;/span&gt;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Objective and motivation&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-044310.png&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;1104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpWfEn/btsJcTjNy2b/mSytq566lqBSU3hY4KE051/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpWfEn/btsJcTjNy2b/mSytq566lqBSU3hY4KE051/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpWfEn/btsJcTjNy2b/mSytq566lqBSU3hY4KE051/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpWfEn%2FbtsJcTjNy2b%2FmSytq566lqBSU3hY4KE051%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;1994&quot; height=&quot;1104&quot; data-filename=&quot;image-20240415-044310.png&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;1104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(Our objective)&lt;/b&gt; Vision transformer의 마지막 attention layer를 visualize 해보면, 위와 같은 &amp;ldquo;abnormal patch&amp;ldquo; 가 보인다 (semantically not important, but strongly attended by other patches). 이런 것들을 오른쪽처럼, &amp;ldquo;semantically meaningful&amp;ldquo; 한 패치에만 attention score가 높도록 만들고 싶다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Doubtful point)&lt;/b&gt; 근데, &lt;u&gt;애초에 왜 abnormal-patch들이 생겨나는 걸까? 이것들의 정체가 뭘까?&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Observation: the problem of the abnormal patches&lt;/h1&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-044709.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bilfK0/btsJch6dJty/uIARcfBz7ujGdHVLWA283k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bilfK0/btsJch6dJty/uIARcfBz7ujGdHVLWA283k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bilfK0/btsJch6dJty/uIARcfBz7ujGdHVLWA283k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbilfK0%2FbtsJch6dJty%2FuIARcfBz7ujGdHVLWA283k%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;1974&quot; height=&quot;1344&quot; data-filename=&quot;image-20240415-044709.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(Observation 1)&lt;/b&gt; self-supervise-trained 모델의 attention map을 활용해서 object detection, object discovery, segmentation 같은 문제를 풀려고 하면 (LOST method), 위 모델 중 &amp;ldquo;DINO&amp;ldquo; 가 잘한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Observation 2)&lt;/b&gt; 반면에, DINO 이후에 개발된 DINOv2는 다른 task에서 DINO보다 잘 함에도 불구하고, 위처럼 attention map이 좋지 않아서 attention-map-driven 방법론 (&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;LOST 같은)을&lt;/span&gt; 사용할 수 없다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관측해 보니, 이러한 문제는 다른 많은 ViT 들에서도 나타나는 일반적인 현상이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이런 일이 일어날까? 그리고 이런 현상을 해소하는 방법은 무엇일까? 해소하게 되면 모델이 더 잘 동작하게 될까? 아래 Obesrvation 3, 4에서는 먼저 &lt;b&gt;왜 이런 일이 일어날까?&lt;/b&gt; 에 대해서 설명한다.&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-panel-type=&quot;info&quot;&gt;
&lt;div data-panel-content=&quot;true&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(Observation 3) 위 attention-map의 heatmap에서 &quot;abnormal patch&quot;들은 다른 pixel에 비해 10배 이상의 높은 norm을 가진다. 그리고 이러한 현상은 ViT의 중간 layer에서, 그리고 충분히 큰 ViT에서 충분히 오랜시간 학습했을때 일어난다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(Observation 4: &lt;span style=&quot;color: #ff2600;&quot;&gt;Strong clue what the abnormal patch is&lt;/span&gt;) 해당 patch들에 linear layer를 붙이면, classification task를 아주 잘 수행한다. (다른 patch들에 붙인것에 비해서)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;rarr; Interpretation: semantically not meaningful token에 대해서, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ViT는 해당 image의 &amp;ldquo;global information&amp;ldquo;을 해당 토큰에 저장&lt;/b&gt;&lt;/span&gt;한다. 따라서 attention score도 높으며, 해당 토큰 만을 이용한 downstream task도 잘 하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Take a closer look at the problem&lt;/h1&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&quot;Artifacts&quot; in the local features of DINOv2&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Definition of the -Artifacts-&lt;/b&gt;: &lt;u&gt;they are high-norm outlier tokens&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-050240.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbscGS/btsJdkgTHgg/IoYPPnUlauDpimZlfGcd6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbscGS/btsJdkgTHgg/IoYPPnUlauDpimZlfGcd6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbscGS/btsJdkgTHgg/IoYPPnUlauDpimZlfGcd6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbscGS%2FbtsJdkgTHgg%2FIoYPPnUlauDpimZlfGcd6K%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;1936&quot; height=&quot;704&quot; data-filename=&quot;image-20240415-050240.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 figure-3에서의 결과처럼, high norm and outlier patches이다. outlier 하다는 것은, 특별히 이미지의 sementics에 별 영향을 주지 않는 어떤 patch라는 소리이다 (위 그림의 white-background처럼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서는, 이러한 outlier-patch 혹은 artifact들이 실제로 global-information을 견인하는가? 에 대한 가설을 위해 여러 evidence를 보여준다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(Evidence 1) Outliers appear during the training of large models&lt;/h3&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-050412.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TSFW4/btsJcS6j6dy/VHfSnxgFdFwZT8J6AlgD80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TSFW4/btsJcS6j6dy/VHfSnxgFdFwZT8J6AlgD80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TSFW4/btsJcS6j6dy/VHfSnxgFdFwZT8J6AlgD80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTSFW4%2FbtsJcS6j6dy%2FVHfSnxgFdFwZT8J6AlgD80%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;2054&quot; height=&quot;762&quot; data-filename=&quot;image-20240415-050412.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1/3 이상의 학습이 되어야 outlier 가 등장한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Outlier는 중간 이후의 layer에 등장한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Outlier는 모델 사이즈가 어느 정도 커야 증가한다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 모델, 학습이 덜 된 모델은 아예 global-information을 배우지 못한 것이라 해석해 볼 수 있다. 반면에, &quot;정보를 더 많이 가졌다&quot;라고 할 수 있는 큰 모델, 학습이 더 된 모델, 더 많은 정보를 가지고 있는 상위 layer에서 이런 norm이 커지는 token들이 많아지는 것은 global-information과 outlier-patch 간의 연관성을 생각할 수 있게 해 준다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(Evidence 2) High norm tokens appear where patch information is redundant &amp;amp; High norm tokens hold little local information&lt;/h3&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-051106.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3WCy1/btsJdPHyE1U/s2lTI5YJ22VQbzCk3X1nNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3WCy1/btsJdPHyE1U/s2lTI5YJ22VQbzCk3X1nNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3WCy1/btsJdPHyE1U/s2lTI5YJ22VQbzCk3X1nNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3WCy1%2FbtsJdPHyE1U%2Fs2lTI5YJ22VQbzCk3X1nNk%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;1960&quot; height=&quot;812&quot; data-filename=&quot;image-20240415-051106.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Outlier patch는 다 또이 또 이하고 의미 없게 생겼다.. background 라던지 그런 것들.&lt;/li&gt;
&lt;li&gt;따라서, 걔네들끼리의 cosine similarity도 높다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;또한, 이런 outlier patch들은 local information 대신 global information&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;만&lt;/b&gt;&lt;/span&gt;을 가지고 있어서, local-information이 필요한 어떤 위치에 있는지 맞추는 task와, 해당 픽셀이 무엇인지 reconstruction 하는 task 둘 다 맞추기 어렵다 (high errors and poor accuracy in the above figure-5 (b)).&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(Evidence 3) Artifacts can resolve classification problem, maybe due to their global information-carrying&lt;/h3&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-051411.png&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS88L5/btsJedA7jEN/sFM4BP4spk6xHlQqUcY8pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS88L5/btsJedA7jEN/sFM4BP4spk6xHlQqUcY8pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS88L5/btsJedA7jEN/sFM4BP4spk6xHlQqUcY8pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS88L5%2FbtsJedA7jEN%2FsFM4BP4spk6xHlQqUcY8pK%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;1938&quot; height=&quot;502&quot; data-filename=&quot;image-20240415-051411.png&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Outlier patch 만으로 classification task 등을 풀면, normal patch 만으로 푸는 것보다 잘 풀린다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Hypothesis and remediation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 가설을 논문에 걸쳐서 세우고 있고, 실제로 이를 위 증거들로 어느 정도 shed-light를 해주었다.&lt;/p&gt;
&lt;div data-panel-type=&quot;info&quot;&gt;
&lt;div data-panel-content=&quot;true&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;(Hypothesis) 충분히 크고, 오래 학습된 ViT 모델은 어떤 불필요한 토큰을 global information을 저장하고, 처리하고, 탐색하는 데 사용된다&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면, 이를 실제로 어떻게 활용해보아야 할까? 원래의 목적이었던, attention-map을 적절하게 유지하면서도, 이러한 global-information을 활용하는 방법은 없을까? 논문에서는 이에 대한 간단한 해답으로 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;register token&lt;/span&gt;&lt;/b&gt;을 제시한다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Remediation: the register tokens&lt;/h3&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-051953.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg83eL/btsJdw2udI1/bPigKNKAWR3qOnPfA99WC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg83eL/btsJdw2udI1/bPigKNKAWR3qOnPfA99WC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg83eL/btsJdw2udI1/bPigKNKAWR3qOnPfA99WC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg83eL%2FbtsJdw2udI1%2FbPigKNKAWR3qOnPfA99WC0%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;1936&quot; height=&quot;828&quot; data-filename=&quot;image-20240415-051953.png&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정말 불필요한 token인 register token을 정의하고, 이러한 global information을 대신해서 받아주길 기대한다. (CLS token에 더해)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맨 마지막 output에는 해당 register token을 뺀다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;memory transformer와 비슷한 구조.. 라는데 memory transformer 잘 모름. translation에 사용되었다고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot; data-text-custom-color=&quot;#ff991f&quot;&gt;&lt;b&gt;(Opinion 1)&lt;/b&gt; seq2 seq 생성에 쓰였으면&amp;hellip; Diffusion도 이런 게 필요하지 않을까 하는 망상 (seq 2 seq이긴 하니까&amp;hellip;?)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot; data-text-custom-color=&quot;#ff991f&quot;&gt;&lt;b&gt;(Opinion 2)&lt;/b&gt; T2I diffusion에서, text embedding을 register token에 갖다 박아버리면 global-information에 text-conditioning을 더 잘할 수 있지 않을까?&amp;hellip; -&amp;gt; 이미 CLIP의 pooled-embedding을 사용하면 비슷한 기능을 하지만 말이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Experiments&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서는, register token을 사용했을 때 실제로 기대했던 효과가 생기는지 (outlier가 없어지는지, attention map이 정상화가 되는지 등)에 대해서 입증한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Verification: 진짜 outlier가 없어짐&lt;/h2&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-052801.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eQTQUh/btsJeCHnWPj/S8Akl0HEG2vPtQAayt7BLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eQTQUh/btsJeCHnWPj/S8Akl0HEG2vPtQAayt7BLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eQTQUh/btsJeCHnWPj/S8Akl0HEG2vPtQAayt7BLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeQTQUh%2FbtsJeCHnWPj%2FS8Akl0HEG2vPtQAayt7BLK%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;1974&quot; height=&quot;600&quot; data-filename=&quot;image-20240415-052801.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;(maybe) side-effect: down-stream task를 좀 더 잘하게 됨&lt;/h2&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-052938.png&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0QGJF/btsJelsnBdc/Ykz2M8YkbtWSgEOM2crnCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0QGJF/btsJelsnBdc/Ykz2M8YkbtWSgEOM2crnCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0QGJF/btsJelsnBdc/Ykz2M8YkbtWSgEOM2crnCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0QGJF%2FbtsJelsnBdc%2FYkz2M8YkbtWSgEOM2crnCk%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;1962&quot; height=&quot;932&quot; data-filename=&quot;image-20240415-052938.png&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논문에서 주장하는 게 meaningful attention map without outlier patches leading to the better performance는 아니었기에&amp;hellip; 일종의 side-effect로 해석됨&lt;s&gt;&lt;span&gt; (의외로 이게 major-contribution이 아니었다. 리뷰어가 닦달했나?)&lt;/span&gt;&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;큰 모델 (DINOv2)가 좀 더 향상이 있는 걸로 보임.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Effect of the number of register tokens&lt;/h2&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-053315.png&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yUFSg/btsJdPneGUK/rk7xjtUilOxXBOoNGw4m71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yUFSg/btsJdPneGUK/rk7xjtUilOxXBOoNGw4m71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yUFSg/btsJdPneGUK/rk7xjtUilOxXBOoNGw4m71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyUFSg%2FbtsJdPneGUK%2Frk7xjtUilOxXBOoNGw4m71%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;1944&quot; height=&quot;712&quot; data-filename=&quot;image-20240415-053315.png&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Global 보다 local이 더 중요할 것 같은 depth-estimation, segmentation이 필요한 reg가 더 적고&amp;hellip; global information이 더 중요할것 같은 ImageNet이 필요한 token이 더 많은 게 이상하긴 하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Object discovery via attention map is now working.&lt;/h2&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-053614.png&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1RN1i/btsJd9MvVRC/dbyTyVNrS6HKdLy7F72InK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1RN1i/btsJd9MvVRC/dbyTyVNrS6HKdLy7F72InK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1RN1i/btsJd9MvVRC/dbyTyVNrS6HKdLy7F72InK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1RN1i%2FbtsJd9MvVRC%2FdbyTyVNrS6HKdLy7F72InK%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;1966&quot; height=&quot;788&quot; data-filename=&quot;image-20240415-053614.png&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논문에서 제일 처음 이야기했던, attention-map을 활용한 downstream task의 degradation을 해소하는 파트이다.&lt;/li&gt;
&lt;li&gt;특히나 이러한 outlier가 심하게 발생하는 큰 모델인 DINOv2에서 꽤 큰 improvement가 일어난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;attention map of the register token&lt;/h2&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20240415-053814.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpnxp2/btsJdnxZ9Cy/ufYUxxXXBPtcXWIBs7obRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpnxp2/btsJdnxZ9Cy/ufYUxxXXBPtcXWIBs7obRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpnxp2/btsJdnxZ9Cy/ufYUxxXXBPtcXWIBs7obRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpnxp2%2FbtsJdnxZ9Cy%2FufYUxxXXBPtcXWIBs7obRK%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;2026&quot; height=&quot;572&quot; data-filename=&quot;image-20240415-053814.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;흥미롭게도, 개별 register token과 다른 pixel들 간에 걸리는 attention map을 살펴보면 각 register token이 담당하는 어떤 &quot;object&quot;가 있는 것처럼 보인다. reg0 은 전체적인 edge, reg6은 캐러멜의, reg8은 스푼의, reg12는 커피의 texture. 이들이 interpretability 에도 도움이 될 것이라 기대해 볼 수 있다.&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Discussion point: How about the registers for DiT?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 Diffusion-transformer에 이러한 register token을 적용하면 어떻게 될지에 대해서 짧게 이야기해 본다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DINOv2랑 CLIP은 모델 구조는 DiT와 같지만, Objective는 전혀 다르다. 그래도 register token을 CLIP에 적용시켜도 될까?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CLIP은 text-image contrastive learning&lt;/li&gt;
&lt;li&gt;DINOv2는 aligning randomly-cropped image; patch masking; and other regularization terms&lt;/li&gt;
&lt;li&gt;하지만, 적어도 위 실험에서는 abnormal-patch가 CLIP (OpenCLIP) 에도 존재하며, register token이 abnormal-patch를 없애주는 걸 관측할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만, 그것이 downstream task에 미치는 영향은 어떨지 모른다. 즉, 개선된 attention-map이 과연 실제로 downstream task---feature embedding for image generation---에 도움이 될지는 명확하지 않은 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Self supervised learning regime에서는 이런 global-feature가 생기는데, diffusion에서는 아닐 수 있을까?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 dummy token 콘셉트를 사용했던 memory transformer에서는 translation task에 register-token like 한 방법론을 적용한 적이 있다 (그것이 같은 문제 때문인지는 모르겠다). 그럼 아주아주 naive 하게 생각한다면, 같은 generative task인 diffusion에서도 적용해 볼 수 있지 않을까?&lt;/li&gt;
&lt;li&gt;restoring masked patch도 Diffusion처럼 &amp;ldquo;input을 복원해 간다 &amp;ldquo;라는 개념에선 비슷하기도 하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;Example of the super-easy implementation&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 구현은, 아래와 같이 간단하게 trainable-parameter로써 register token을 추가해 주고, 기존 transformer block에 추가해 버리는 식으로 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 예시는 stable-diffusion 3에서 MMDiT model class (official code 아님, 자체 구현한 것)에서 이를 활용하는 예시이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;__init__()에서, self.register_tokens를 정의하고&lt;/li&gt;
&lt;li&gt;forward()에서, transformer의 input-sequence에 해당하는 emb_x에 해당 register-token을 sequence-dimension에 concat 시켜주고, 맨 마지막에는 이 부분을 제외시켜 준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;haskell&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;class MMDiT(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.patch_size = config.patch_size
        self.h, self.w = config.height, config.width
        self.register_token_num = config.register_token_num

        # Embedding for (1) text; (2) input image; (3) time 
        self.text_cond = TextConditionModule(config.text_emb_size, config.hidden_size)
        self.patching = LatentPatchModule(config.patch_size, config.hidden_size)
        self.time_emb = TextTimeEmbedding(config.time_embed_size, config.pooled_text_size, config.cond_size)
        
        self.mmdit_blocks = nn.ModuleList(
            [MMDiTBlock(config.hidden_size, config.time_embed_size, config.attn_embed_size, config.mlp_dim, config) for layer_idx in range(config.num_layers)]
        )
        
        self.final_linear = nn.Linear(config.hidden_size, config.out_channel)
        self.modulation = nn.Linear(config.cond_size, 2)
        self.pos_embed = torch.from_numpy(get_2d_sincos_pos_embed(config.hidden_size, (self.h//self.patch_size, self.w//self.patch_size)))
        self.register_tokens = nn.Parameter(torch.zeros(1, self.register_token_num, config.hidden_size))

    def forward(self, latent, t, text_embs: List[torch.Tensor], pooled_text_embs):
        &quot;&quot;&quot;
            latent (torch.Tensor)
            t (torch.Tensor)
            text_embs (List[torch.Tensor])
            pooled_text_embs (torch.Tensor)
        &quot;&quot;&quot;
        emb_c = self.text_cond(*text_embs) # (N, L, D)
        emb_t = self.time_emb(pooled_text_embs, t) # (N, D)
        emb_x = self.patching(latent) + self.pos_embed # (N, T, D), where T = H*W / (patch_size ** 2)

        # additional &quot;register&quot; tokens, to convey the global information
        # see https://openreview.net/forum?id=2dnO3LLiJ1
        emb_x = torch.cat((self.register_tokens.expand(emb_x.shape[0], -1, -1), emb_x), dim=1)
        

        for block in self.mmdit_blocks:
            emb_x, emb_c = block(emb_x, emb_c, emb_t)

        # remove register token for the output layer
        emb_x = emb_x[:,self.register_token_num:] 

        scale, shift = self.modulation(emb_x, emb_t)
        emb_x = self.final_linear(scale*emb_x + shift) # (N, T, patch_size**2 * out_channels)
        return self.patching.unpatchify(emb_x) # (N, out_channels, H, W)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Showing off studying ML/ML - 특집</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/16</guid>
      <comments>https://bayesian-bacteria.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 23 Aug 2024 15:25:24 +0900</pubDate>
    </item>
    <item>
      <title>(3.8/5.0) 몽중식: &amp;quot;진짜&amp;quot; 경험팔이 가게</title>
      <link>https://bayesian-bacteria.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;경험팔이&lt;/h2&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;성수동에서의 실제로 살 물건이 있는건 아니지만 신기해서 들어가 보는 팝업스토어라던지, 귀여운 물건들을 보고 와 굉장히 귀엽다라고 말하고서는 사지 않고 뒤돌아서는 소품샵들이라던지 (이거 정말로 궁금한 건데, 소품샵에서의 실구매율은 얼마나 될지 다른 업종들과 비교해서 측정해보고 싶다). 사실은 피시방에서 끓여 먹는 짜계치가 더 맛있지만 평소에 먹어보지 못한 맛과 멋좀 부리려고 가는 다이닝이나---적어도 나는 막입이라서 그렇고, 다른 사람들은 어떨지 모르겠다---모두 &quot;경험팔이&quot;로 보일 때가 종종 있다.&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;경험팔이라 한들, 아무렴 어떠하랴, 양질의 경험만 제공하고 좋은 놀잇거리가 되면은 아무래도 그만인것이다. 그런 의미에서, 몽중식의 경험팔이는 훌륭하다. 재방문을 3회 한 다이닝 (이라고 부르는 게 맞긴 할까?) 은 일단 지금까지 최초.&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 몽중식은 식당이다. 당연히 음식 판다. 일반적인 다이닝 처럼 매 시즌별로 메뉴가 바뀌고, 메뉴는 고를 수 없이 코스다. 중식을 기본으로 하고, 고량주 페어링을 할 수가 있다. 그럼, 일반적인 다이닝의 경험팔이를 넘어서, 무엇이 몽중식을 &lt;b&gt;진짜&lt;/b&gt; 경험팔이로 만드는가?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몽중식은 테마가 있는 식당이다. 이러한 &lt;b&gt;테마&lt;/b&gt;를 판매한다. 하나의 테마를 이루는것은&lt;/p&gt;
&lt;pre id=&quot;code_1724162477217&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;theme_key = ('영화', '음식', '스토리텔링', '드레스코드', '소품')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 quint로 구성된다.&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;이들 중에서, 해당 테마의 identity를 결정하는 것은 &lt;b&gt;영화이다,&lt;/b&gt; 매 계절별로 (주로 중화권의) 영화를 선정하고, 해당 영화의 스토리라인을 따라가면서 음식이 서빙되고 (특정 장면이나 인물에 연관 지어 음식이 결정된다), 해당 영화와 관련한 드레스코드를 제시하며, 식사 중에는 스토리텔러 (라고 부르던가? 무튼 이걸 담당하는 분이 진짜 있다)가 영화의 흐름을 설명해 준다. 처음 자리에 앉으면, 영화와 관련된 소품들과 영화의 스토리와 그 스토리에 해당하는 음식을 설명해 주는 &quot;그림 카드&quot; 같은 것들이 자리에 놓여있다---코스가 지날 때마다, 그림 카드를 한 장씩 넘겨준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 015.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LNLbo/btsI8SlbAWj/xA1IMH0c9NSniPpt4IevWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LNLbo/btsI8SlbAWj/xA1IMH0c9NSniPpt4IevWk/img.jpg&quot; data-alt=&quot;'소품' 에 해당하는 것들. 영화 '암살' 에서의 안옥윤씨의 안경과 총, 그리고 뭔가 개화기스러운 물건들과 안경집.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LNLbo/btsI8SlbAWj/xA1IMH0c9NSniPpt4IevWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLNLbo%2FbtsI8SlbAWj%2FxA1IMH0c9NSniPpt4IevWk%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;546&quot; height=&quot;364&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 015.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'소품' 에 해당하는 것들. 영화 '암살' 에서의 안옥윤씨의 안경과 총, 그리고 뭔가 개화기스러운 물건들과 안경집.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 014.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHz8ok/btsI81oKXM9/qT3MebGcthmZkXlIrp3EI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHz8ok/btsI81oKXM9/qT3MebGcthmZkXlIrp3EI1/img.jpg&quot; data-alt=&quot;'드레스코드' 에 해당하는것들. 사실은 한국적인 미가 드레스코드였으나, 무시하고 자체적으로 극중 인물들의 분장을 했다. 콧수염은 그려진것.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHz8ok/btsI81oKXM9/qT3MebGcthmZkXlIrp3EI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHz8ok%2FbtsI81oKXM9%2FqT3MebGcthmZkXlIrp3EI1%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;551&quot; height=&quot;367&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 014.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'드레스코드' 에 해당하는것들. 사실은 한국적인 미가 드레스코드였으나, 무시하고 자체적으로 극중 인물들의 분장을 했다. 콧수염은 그려진것.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 009.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TwKUi/btsJaRj8LPE/c6W8F7H6lYUfgakHFFvg80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TwKUi/btsJaRj8LPE/c6W8F7H6lYUfgakHFFvg80/img.jpg&quot; data-alt=&quot;(스포주의) 암살에서의 염석진 (이정재분) 씨를 상징하는 음식. 시꺼먼 마음을 가지고 있대나 뭐래나. 뭐 대충 들리는대로 듣고 잘 파먹었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TwKUi/btsJaRj8LPE/c6W8F7H6lYUfgakHFFvg80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTwKUi%2FbtsJaRj8LPE%2Fc6W8F7H6lYUfgakHFFvg80%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;582&quot; height=&quot;388&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-20-23-05-44 009.jpeg&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(스포주의) 암살에서의 염석진 (이정재분) 씨를 상징하는 음식. 시꺼먼 마음을 가지고 있대나 뭐래나. 뭐 대충 들리는대로 듣고 잘 파먹었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미롭지 않은가? 그 외에도 몇 가지 깨알 같은 재미가 있다. 고량주 페어링의 3-4번째 즈음에는 (기억 잘 안남) 항상 몽비어 (맥주를 양조하시더라. 몽중식 자체맥주)에 다 함께 고량주를 집어넣어야 한다던지...&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;하나의 테마를 관통하는 영화로 꿰어진&amp;nbsp;여러 가지 경험요소들이 몽중식을 진짜 경험팔이로 만든다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 얘기했는데, 그냥 가벼운 맘으로 재밌어 보이니까 가보자 해도 충분한 곳. 다만, 예약이 쉬운 편은 아니었던 걸로. 그리고 재방문자가 매우 많다. 매우... 중간에 처음 와보신 분들 손들라고 시키는데, 그 수가 많지 않다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;식당인데, 맛은 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적인 기준으로는, 오락가락한다. 워낙 자극적인 맛을 추구하고, 중식에 기대하는 어느 정도의 자극적인 맛이 있는 상태에다가, 입도 막입이다 보니 &quot;아 마라샹궈 생각난다&quot; &quot;아, 불닭 생각난다&quot; 할 때가 있다. 다만, 다채롭다. 보통 9코스로 진행되는데 뭔 어디서도 먹어본 적 없는 걸 먹을 때가 흔하다. 그리고 보통은 &quot;먹을만하다&quot; &quot;맛있는 것 같다&quot; 이상일 때가 많다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRcnoA/btsJasd2nvG/UiyI5EZNOxcGqDxMhL1LVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRcnoA/btsJasd2nvG/UiyI5EZNOxcGqDxMhL1LVK/img.png&quot; data-alt=&quot;신기한데 (내입에만) 별로였던것의 예시. 이름은 기억이 안나는데, 위에는 표고버섯 아래는 튀김이었다. 튀김 속이 뭐였는지도 기억이 안나네... 불호였던 이유는 (1) 내 기준 간이 삼삼함 (2) 표고가 너무 딱딱했음 이었다. 하지만 여전히! 테마와 경험에는 충실하다. 안옥윤씨가 백화점에서 안경을 샀을때를 표현하는것... 그러니까, 저 표고버섯이 안경이다 미친...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRcnoA/btsJasd2nvG/UiyI5EZNOxcGqDxMhL1LVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRcnoA%2FbtsJasd2nvG%2FUiyI5EZNOxcGqDxMhL1LVK%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;623&quot; height=&quot;415&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신기한데 (내입에만) 별로였던것의 예시. 이름은 기억이 안나는데, 위에는 표고버섯 아래는 튀김이었다. 튀김 속이 뭐였는지도 기억이 안나네... 불호였던 이유는 (1) 내 기준 간이 삼삼함 (2) 표고가 너무 딱딱했음 이었다. 하지만 여전히! 테마와 경험에는 충실하다. 안옥윤씨가 백화점에서 안경을 샀을때를 표현하는것... 그러니까, 저 표고버섯이 안경이다 미친...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCqz9/btsI9zL0CPi/KD1y6SJTPTxMey9m180cyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCqz9/btsI9zL0CPi/KD1y6SJTPTxMey9m180cyK/img.png&quot; data-alt=&quot;페어링때 나온 술. 무려 이름이 혁명 (레볼루씨옹) 소주다. 붉은 색체와 저 특유의 선전 그림체. 아! 낫과 망치를 가져오라. (따위로 생각했는데, 사실 그것과는 별로 관계가 없다고 스토리텔러분이 말해주더라)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCqz9/btsI9zL0CPi/KD1y6SJTPTxMey9m180cyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCqz9%2FbtsI9zL0CPi%2FKD1y6SJTPTxMey9m180cyK%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;686&quot; height=&quot;457&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;페어링때 나온 술. 무려 이름이 혁명 (레볼루씨옹) 소주다. 붉은 색체와 저 특유의 선전 그림체. 아! 낫과 망치를 가져오라. (따위로 생각했는데, 사실 그것과는 별로 관계가 없다고 스토리텔러분이 말해주더라)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;재방문할 건가요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로운 영화 테마가 있다면 가고 싶다. 옛 홍콩영화 테마에서, 가죽재킷을 입고 선글라스를 낀 채로, 플래시 페이퍼에 100달러를 프린팅 해서 불태워버리고 싶다. 경험증강이랄까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%84%9C%EC%9A%B8%20%EB%A7%88%ED%8F%AC%EA%B5%AC%20%EC%97%B0%EB%82%A8%EB%8F%99%20229-56%202%EC%B8%B5&amp;amp;addtype=1&amp;amp;confirmid=1748774897&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A483355%2C%22mapCenterY%22%3A1128698%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A483358%2C%22y%22%3A1128700%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%AA%BD%EC%A4%91%EC%8B%9D%22%2C%22confirmid%22%3A1748774897%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=483355&amp;amp;mapY=1128698&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=1144071000&amp;amp;tel=010-2601-2856&amp;amp;title=%EB%AA%BD%EC%A4%91%EC%8B%9D&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1724163923118&quot; id=&quot;maps_1724163923118&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%84%9C%EC%9A%B8%20%EB%A7%88%ED%8F%AC%EA%B5%AC%20%EC%97%B0%EB%82%A8%EB%8F%99%20229-56%202%EC%B8%B5&amp;amp;addtype=1&amp;amp;confirmid=1748774897&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A483355%2C%22mapCenterY%22%3A1128698%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A483358%2C%22y%22%3A1128700%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%AA%BD%EC%A4%91%EC%8B%9D%22%2C%22confirmid%22%3A1748774897%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=483355&amp;amp;mapY=1128698&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=1144071000&amp;amp;tel=010-2601-2856&amp;amp;title=%EB%AA%BD%EC%A4%91%EC%8B%9D&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=483355%2C1128698&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A483358%2C1128700&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상과 생각/일상 - 들렸던 가게들</category>
      <category>몽중식</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/15</guid>
      <comments>https://bayesian-bacteria.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 20 Aug 2024 23:26:03 +0900</pubDate>
    </item>
    <item>
      <title>[Reels] Battle of the Backbones: A large-Scale Comparison of pre-trained models across computer vision tasks</title>
      <link>https://bayesian-bacteria.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NeurIPS 2023, &lt;a href=&quot;https://arxiv.org/abs/2310.19909&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Arxiv Link&lt;/a&gt;&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;What they did&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;They propose &quot;Battle-of-the-Backones&quot;(BoB), benchmarking a diverse suite of (vision) pre-trained models, including classic ImageNet-trained CNN, vision-language models (perhaps CLIP).&amp;nbsp;&lt;/b&gt;&lt;/span&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;1884&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVBYM/btsI7VPu7qG/osR3kry0b9Xex3ZfyqpwdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVBYM/btsI7VPu7qG/osR3kry0b9Xex3ZfyqpwdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVBYM/btsI7VPu7qG/osR3kry0b9Xex3ZfyqpwdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVBYM%2FbtsI7VPu7qG%2FosR3kry0b9Xex3ZfyqpwdK%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;1884&quot; height=&quot;816&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;816&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;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;The target tasks are OOD-generalization, classification, object-detection and Image retrieval.&lt;/b&gt;&lt;/span&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;1818&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6PWGF/btsI7V23UUT/o7UBNuyAxpOzrUMicsVMq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6PWGF/btsI7V23UUT/o7UBNuyAxpOzrUMicsVMq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6PWGF/btsI7V23UUT/o7UBNuyAxpOzrUMicsVMq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6PWGF%2FbtsI7V23UUT%2Fo7UBNuyAxpOzrUMicsVMq0%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;1818&quot; height=&quot;930&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Key observations&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;with more than 1,500 training runs, they found that CNN pretrained in a supervised fashion still perfrom best on most tasks.&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;1916&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZHmg1/btsI9tKRlOL/bYHEhJsS3zDX0qseIq5tDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZHmg1/btsI9tKRlOL/bYHEhJsS3zDX0qseIq5tDK/img.png&quot; data-alt=&quot;IN standing for the ImageNet, which represents the supervise-trained CNNs&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZHmg1/btsI9tKRlOL/bYHEhJsS3zDX0qseIq5tDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZHmg1%2FbtsI9tKRlOL%2FbYHEhJsS3zDX0qseIq5tDK%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;1916&quot; height=&quot;1230&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IN standing for the ImageNet, which represents the supervise-trained CNNs&lt;/figcaption&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;b&gt;(My opinion 1)&lt;/b&gt; &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;i&gt;it is not suprising that the supervisly-pre-trained models (IN-nK in the above figure) works better on &quot;supervised-learning classification problem.&quot;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;(&lt;b&gt;My opinion 2)&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;i&gt;the recent attentions and success of the ViT architecture is not because its model architecture is well-suited for a vision task---in other words, it has a good inductive-bias for vision tasks)---, but it is because the transformer-like architecture has been well-optimized throughout the deep-learning community after the advent of the LLM.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ViTs are more sensitive to the amount of the data and number of parameters than CNNs&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;(My opinion 3)&lt;/b&gt; &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;i&gt;this may claim that the ViT architecture may scale better than CNN, at the some scale of data and model parameters. (In fact, the authors already discuss it in Sec 5.)&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Monocular depth-estimation achieves performances competitive with top-conventional supervised and SSL backbones&lt;/b&gt; -&amp;gt; the author claims it implies the depth-estimation tasks may serve as a powerful and generalizable primary or auxiliary pre-training task.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(Q)&lt;span style=&quot;color: #781b33;&quot;&gt; Even pre-trained depth-estimation task can work well on the generative task such as the Stable-Diffusion?? (Fortunately, the input-output dimension is well-matched for both tasks unlike other tasks like classification or others, meaning no need to modify the model itself.)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;And there are many other insightful observation in the paper! please check-out the original paper.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Showing off studying ML/ML - academic reels</category>
      <author>BayesianBacteria</author>
      <guid isPermaLink="true">https://bayesian-bacteria.tistory.com/14</guid>
      <comments>https://bayesian-bacteria.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 20 Aug 2024 12:56:48 +0900</pubDate>
    </item>
  </channel>
</rss>