<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이름뭐로짓지</title>
    <link>https://tro555.tistory.com/</link>
    <description>~.~</description>
    <language>ko</language>
    <pubDate>Mon, 20 Jul 2026 18:07:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Woouuk</managingEditor>
    <item>
      <title>국민대 자율주행 경진대회 예선(이자 마지막..)</title>
      <link>https://tro555.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자율주행 경진대회에 5명이 한 팀으로 출전했다.&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;2. 자율주차 시스템을 디자인하여 보고서 제출&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;예선에 대해 말해도 되는지 몰라 시뮬 코스와 미션에 대해 간략하게 설명하겠다.&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;2. 코스는 일방 통행의 2차선으로, 코스에 도달하여 잠시 길을 따라 전진 후, 정지선과 신호등 구간을 만난다.&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;4. 단, 랜덤으로 경찰차가 지름길로 가는 길을 막고 있을 수 있다. 지름길에는 아무런 장애물이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 직진을 하게 되면 S자 코스가 나오고, 도중에 보행자가 가로지른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 당연히 보행자는 멈추거나, 가로질러서 부딪히면 안되고, S자 코스를 지나면 차량 두 대가 기다리고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 차량 두 대는 2차선을 막고 있으나, 두 대가 함께 전진을 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 이 두 대는 서로 속도가 다르다. 속도가 느린 차를 추월해서 진행해야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 이 부분을 지나면 지름길에서 빠져나오는 부분과 만난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 직후에, 어린이 보호구역이 나와 차량 속도가 15 이하로 제한된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 이후 맨 처음 라바콘을 지난 시점의 코스를 다시 만난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 이렇게 총 두 바퀴 반을 돌면 완주&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;기본적으로 국민대에서 제공하는 ROS2 기반의 아키텍처가 있다(cam, pointcloud, imu 패키지 등). 이를 따라서 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 처음, 감지할 수 있는 원시 데이터들과 우리가 주행해야 하는 코스 및 미션을 토대로 필요한 패키지들(서브시스템들)을 명세하여 인터페이스를 정의하였고, 다 같이 &quot;판단부&quot;를 어떻게 만들지 정했다. (yolo 객체감지나 차선 감지가 워낙 오픈소스가 잘 되어 있어 오히려 판단이 key라고 생각했기 때문이다.)&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;판단부는 최근에 구현해 본 경험이 있던 state_machine으로 만들었다.&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;1654&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/41UsW/dJMcagTxoNf/mfUeGLGtYrkwjvkKuzxoB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/41UsW/dJMcagTxoNf/mfUeGLGtYrkwjvkKuzxoB0/img.png&quot; data-alt=&quot;state machine&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/41UsW/dJMcagTxoNf/mfUeGLGtYrkwjvkKuzxoB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F41UsW%2FdJMcagTxoNf%2FmfUeGLGtYrkwjvkKuzxoB0%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;1654&quot; height=&quot;1018&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;state machine&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;그리고 위의 판단부 중 상태머신 패키지를 시작으로 lidar 패키지, vision 패키지, 경로 생성 패키지, 컨트롤 패키지로 설계를 나누었고, 나는 이 중 상태머신과 컨트롤 패키지 알고리즘 설계 및 구현을 담당했다.&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;대회에서 제공해주는 imu 패키지 등이 파이썬 기반이라 상태머신도 파이썬으로 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 제어부는 cpp로 구현하였고, ROS2 기반으로 구현된 stanley 오픈소스를 찾아 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Team-Stier/kookmin-Stier1-src/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Team-Stier/kookmin-Stier1-src/tree/main&lt;/a&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;(현재 해당 github는 private으로 되어있다.)&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;중간에 상태머신을 구현하며, 한 바퀴 돌고 끝이 아니기 때문에 다음 상태로 전이하며 기존 상태로의 전이를 판단한 bool 값 등의 파라미터들을 초기화해줘야 하는 문제가 있었다. 이를 제외하고는 SW 규모가 크지 않고, 초반에 명세서를 만드는 데에 공을 많이 들여 비교적 수고가 적었다. (또한 내가 맡은 파트가 크게 신경써야 할 부분이 없었던 것 같다. 제어는 수신/발행 인터페이스와 그 로직이 거의 정해져 있고, 상태머신 또한 실차 테스트에서 파라미터 수정 정도뿐이 없기 때문이다.)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상반기에 자율주행 직무로 나가고 싶어 커피챗도 해보고, 교육도 듣고 했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알아볼수록 현재 나의 상황으로는 모빌리티 직무를 맡기에는 전망이 좋지 않다는 판단이 서 이번 국민대 자율주행 대회 참가를 마지막으로 더 이상 자율주행 SW를 개발할 일은 없을듯 하다. 또한 이 대회를 참가하는 도중, ax에도 관심이 많아 skala에 지원하였는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사하게도 나를 붙여주셔서 다음 글은 skala 활동이 될 듯 하다..! 자율주행 안녕 ㅠ&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;</description>
      <category>개발 일지/자율주행 개발일지</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/39</guid>
      <comments>https://tro555.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 24 Jun 2026 15:33:01 +0900</pubDate>
    </item>
    <item>
      <title>자율주행 개발일지 04</title>
      <link>https://tro555.tistory.com/38</link>
      <description>&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;기본적으로 pi0-FAST는 CE로 출력을 뽑는데, 이게 fine-tuning하면서 출력 시 10개의 waypoint가 아닌, 하나의 waypoint로 출력되는 문제가 발생했다..! (근데 왜 앞전의 poc 단계에서는 10개를 뽑았을까? 이건 도저히 모르겠다,, 나중에 교수님께 여쭤보던가 해야지. 혹시 아는 분 계시면 댓글좀..)&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;2480&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4jZL/dJMcajoNOBM/zsZLUD47jfdfzDiOCKikyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4jZL/dJMcajoNOBM/zsZLUD47jfdfzDiOCKikyK/img.png&quot; data-alt=&quot;위와 같이 출력된다..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4jZL/dJMcajoNOBM/zsZLUD47jfdfzDiOCKikyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4jZL%2FdJMcajoNOBM%2FzsZLUD47jfdfzDiOCKikyK%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;2480&quot; height=&quot;998&quot; data-origin-width=&quot;2480&quot; data-origin-height=&quot;998&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;그래서 부득이하게 pi0.5로 전환했다. 코드 다시 짜기 힘들다,,&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;이후 이번에는 poc 단계에서 10개의 waypoint가 찍히는 것을 확인하고, 1000개의 에피소드를 필터링해 각 앞의 2hz씩, 약 38프레임씩 총 38000 프레임을 10epoch 학습시켰다. 소요시간은 무려 30시간..! 가난한 학생은 어쩔수 없지 싶다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실망스러웠다.. ㅠㅠ&lt;/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;3184&quot; data-origin-height=&quot;1772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ziy9V/dJMcaffLQuT/KjYGBD6ZTG9VC5JsMlXGBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ziy9V/dJMcaffLQuT/KjYGBD6ZTG9VC5JsMlXGBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ziy9V/dJMcaffLQuT/KjYGBD6ZTG9VC5JsMlXGBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZiy9V%2FdJMcaffLQuT%2FKjYGBD6ZTG9VC5JsMlXGBk%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;3184&quot; height=&quot;1772&quot; data-origin-width=&quot;3184&quot; data-origin-height=&quot;1772&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3260&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/77pQ8/dJMcagZXQ3R/sAxY3eZrJXRKCB38DK9Uok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/77pQ8/dJMcagZXQ3R/sAxY3eZrJXRKCB38DK9Uok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/77pQ8/dJMcagZXQ3R/sAxY3eZrJXRKCB38DK9Uok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F77pQ8%2FdJMcagZXQ3R%2FsAxY3eZrJXRKCB38DK9Uok%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;3260&quot; height=&quot;1064&quot; data-origin-width=&quot;3260&quot; data-origin-height=&quot;1064&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;이렇게 trajectory를 전혀 예측하지 못한 경우도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터들을 쭉 살펴보며 무슨 차이가 있나 봤더니 로봇 팔을 학습시킨 것을 생각했을 때, 특정 에피소드의 instruction을 넘겨주면. 예를 들어 &quot;두 팔을 들어 컵을 집어라 &quot;라고 했을 때 만약 camera image 상 두 팔을 이미 든 상태라면 instruction에서 '두 팔'의 가중치를 낮게 주게 된다. 이런 식으로 출력인 action을 chunk 형태로, 사이클마다 주게 될 것이고 이에 맞게 로봇이 action을 취하는 것이다.&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;에서 이제 우회전해야 하는 상황인데, '직진한'에 낮은 가중치를 주지 못한 것으로 보인다. 그래서 정말정말 마지막으로, 각 에피소드를 앞의 2hz씩 자르는 것이 아닌 1000개의 에피소드의 시작하는 첫 프레임만 가지고, 1000개의 데이터로 학습시켜보기로 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;큰 변화는 없었다. 아니, 애초에 에피소드 index가 전혀 다른 상황이 아니라 연속적인 주행에서 촬영한 데이터셋인듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 앞전의 결과와 거의 동일하므로, 따로 결과사진을 올리진 않겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 Loss는 줄어들었는데, minADE와 minFDE가 전혀 줄어들지 않는다. 아무래도 내가 설계한 학습 파이프라인 자체가 collapse를 유발하는 형태로 보인다. 이를 어떻게 고치면 좋을지는 좀 더 딥하게 아는 분들의 자문이 필요할 듯 해서, 교수님께 자문을 구하고 와야겠다..&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;우선 pi0 모델을 사용하여 차량의 미래 주행 궤적을 예측해내는 프로젝트는 여기서 마치도록 하겠다.&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;/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;- 데이터를 시각적으로 처리하고 남겨두는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력값과 출력값의 관계의 정합성의 중요성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- poc 단계의 중요성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 대해 깨달았다. 뭔가 하다보니 좀 더 학구열이 생기는데, vla 모델을 좀 더 깊게 파보고 다시 학습시켜보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--- 추가 업데이트&lt;/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;codex와 씨름한 결과 이렇다고 한다.&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;전제가 일부 잘못됐고, 현재 세팅의 pi0.5는 waypoint predictor로 거의 &quot;평균 궤적&quot;을 내는 상태이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;train mean trajectory baseline on val을 보면, ADE = 10.97, FDE = 22.98&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 모델의 1250 step(마지막 스텝)을 보면 ADE = 10.97, FDE = 21.07&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;zero-baseline: ADE = 50.27, FDE = 93.66&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;b&gt;즉, 모델은 zero보다는 훨씬 낫지만 train set의 평균 baseline과 거의 동일하다. 그래서 로스는 감소했지만 FDE와 ADE는 줄지 않는 것.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모델이 조건부로 장면을 읽고 궤적을 잘 예측한다기 보다, 대충 앞으로 8~90m를 가는 평균 패턴을 학습한 쪽에 가깝다,,&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;b&gt;이런 일이 생긴 이유로는&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. loss와 metric이 서로 다른 vector이다. (다른 공간을 본다)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;학습 loss는 quantile-normalized된 [10, 32] action denoising/regression loss인데 나는 [x, y] waypoint를 32차원에 각각 반반씩 넣었고, 추론 때 다시 평균을 냈다. 이 구조에서는 loss가 줄어도 실제 ADE/FDE가 줄지 않을 수 있다. 실제로, action_replica_std_mean은 12.63 -&amp;gt; 2.09로 크게 줄었다. 즉, 32개 replica channel consistency는 좋아졌으나, waypoint 위치 정확도는 별로 안 좋아진 것.&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;b&gt;2. 평균으로 수렴하기 쉬운 문제이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;waypoint 예측은 장면/route ambiguity가 크다. MSE류 loss는 불확실할 때 평균 궤적을 선호한다.(즉, 불확실해서 평균 궤적으로 수렴했다는 것..) 최종 예측의 final waypoint 분산도 traget보다 작다. traget final std는 대략 [22.2, 23.7]인데 prediction final std는 [12.0, 11.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;b&gt;3. train/val 분포가 다르다. -&amp;gt; 이것도 중요해보인다,, 데이터 전처리에서 중요해보임!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;train은 각 에피소드 첫 프레임 1000개만 사용했다. 그런데 val은 100개 에피소드에서 2Hz로 뽑은 3800개, 즉 중간 frame이 대부분이다. 첫 프레임만 보고 배운 모델을 주행 중간 frame들에 평가하면 평균 궤적으로 버티는 쪽으로 가기 쉽다.&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;b&gt;4. minADE/minFDE 이름도 지금은 약간 오해의 소지가 있다. (?)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 num_sample = 1이라서 minADE/minFDE는 ADE/FDE와 같다. 여러 궤적 샘플 중 best를 고르는 일반적인 minADE/minFDE가 아니다.&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;b&gt;즉, 현재 pi0.5 + 32D 반복 action encoding + first-frame-only 1000개 + normalized loss 조합은 waypoint 예측에 적합하지 않다. 지금 결과는 모델이 쓸만하거나를 판단하기보다, 평균 baseline에 수렴했다고 봐야 한다..&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 일지/자율주행 개발일지</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/38</guid>
      <comments>https://tro555.tistory.com/38#entry38comment</comments>
      <pubDate>Sun, 31 May 2026 20:15:11 +0900</pubDate>
    </item>
    <item>
      <title>SVM</title>
      <link>https://tro555.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779879873472&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;소프트웨어 공학 - Object_orientation&quot; data-og-description=&quot;OOT?객체지향(object orientation)에는 4가지 키워드가 있다.등장 배경HW의 부품처럼 SW도 modulization을 통해 각 모듈이 독립적으로 동작하도록 설계전체 기능을 모듈 단위로 분해하고각 모듈의 인터페이&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; data-og-url=&quot;https://velog.io/@dkim1540/소프트웨어-공학-Objectorientation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rt4hj/dJMb8WMwbSZ/kDjsgHoKG1UzJ1Hacy08bk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/g2vnX/dJMb8Rj8A5v/fZkhDJo0Y13WjkZumvkhGk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/R3yai/dJMb86O8jdq/wM2V2DHzDrFERkkGPYTVB1/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rt4hj/dJMb8WMwbSZ/kDjsgHoKG1UzJ1Hacy08bk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/g2vnX/dJMb8Rj8A5v/fZkhDJo0Y13WjkZumvkhGk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/R3yai/dJMb86O8jdq/wM2V2DHzDrFERkkGPYTVB1/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학 - Object_orientation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OOT?객체지향(object orientation)에는 4가지 키워드가 있다.등장 배경HW의 부품처럼 SW도 modulization을 통해 각 모듈이 독립적으로 동작하도록 설계전체 기능을 모듈 단위로 분해하고각 모듈의 인터페이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;velog에 작성해두었다.&lt;/p&gt;</description>
      <category>cs/기계학습심화</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/37</guid>
      <comments>https://tro555.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 27 May 2026 20:04:42 +0900</pubDate>
    </item>
    <item>
      <title>객체지향 설계</title>
      <link>https://tro555.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779879846102&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;소프트웨어 공학 - Object_orientation&quot; data-og-description=&quot;OOT?객체지향(object orientation)에는 4가지 키워드가 있다.등장 배경HW의 부품처럼 SW도 modulization을 통해 각 모듈이 독립적으로 동작하도록 설계전체 기능을 모듈 단위로 분해하고각 모듈의 인터페이&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; data-og-url=&quot;https://velog.io/@dkim1540/소프트웨어-공학-Objectorientation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rt4hj/dJMb8WMwbSZ/kDjsgHoKG1UzJ1Hacy08bk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/g2vnX/dJMb8Rj8A5v/fZkhDJo0Y13WjkZumvkhGk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/R3yai/dJMb86O8jdq/wM2V2DHzDrFERkkGPYTVB1/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dkim1540/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Objectorientation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rt4hj/dJMb8WMwbSZ/kDjsgHoKG1UzJ1Hacy08bk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/g2vnX/dJMb8Rj8A5v/fZkhDJo0Y13WjkZumvkhGk/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376,https://scrap.kakaocdn.net/dn/R3yai/dJMb86O8jdq/wM2V2DHzDrFERkkGPYTVB1/img.png?width=811&amp;amp;height=376&amp;amp;face=0_0_811_376');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학 - Object_orientation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OOT?객체지향(object orientation)에는 4가지 키워드가 있다.등장 배경HW의 부품처럼 SW도 modulization을 통해 각 모듈이 독립적으로 동작하도록 설계전체 기능을 모듈 단위로 분해하고각 모듈의 인터페이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;velog에 작성해두었다.&lt;/p&gt;</description>
      <category>cs/소프트웨어 공학</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/36</guid>
      <comments>https://tro555.tistory.com/36#entry36comment</comments>
      <pubDate>Wed, 27 May 2026 20:04:12 +0900</pubDate>
    </item>
    <item>
      <title>K-means</title>
      <link>https://tro555.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/K-means-%EC%8B%A4%EC%8A%B5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dkim1540/K-means-%EC%8B%A4%EC%8A%B5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779879659999&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;K-means 실습&quot; data-og-description=&quot;K-means앞선 KNN은 라벨이 있는 상태에서 새로운 데이터의 위치를 찾는 분류 모델이었다.K-means는 라벨이 없는 상태에서 데이터를 정해진 개수의 군집으로 나누는 비지도학습 알고리즘이다. 작동 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dkim1540/K-means-%EC%8B%A4%EC%8A%B5&quot; data-og-url=&quot;https://velog.io/@dkim1540/K-means-실습&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jUJPQ/dJMb86n378J/YZ3820uaJmkpb2djtr5eGk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/BAWZ2/dJMb81fZb8w/OKjD0lxIQGYUKEribvU9qk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/K-means-%EC%8B%A4%EC%8A%B5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dkim1540/K-means-%EC%8B%A4%EC%8A%B5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jUJPQ/dJMb86n378J/YZ3820uaJmkpb2djtr5eGk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/BAWZ2/dJMb81fZb8w/OKjD0lxIQGYUKEribvU9qk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;K-means 실습&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;K-means앞선 KNN은 라벨이 있는 상태에서 새로운 데이터의 위치를 찾는 분류 모델이었다.K-means는 라벨이 없는 상태에서 데이터를 정해진 개수의 군집으로 나누는 비지도학습 알고리즘이다. 작동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;velog에 작성해두었다.&lt;/p&gt;</description>
      <category>cs/기계학습심화</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/35</guid>
      <comments>https://tro555.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 27 May 2026 20:01:04 +0900</pubDate>
    </item>
    <item>
      <title>KNN</title>
      <link>https://tro555.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/KNN%EC%8B%A4%EC%8A%B5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dkim1540/KNN%EC%8B%A4%EC%8A%B5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779879622623&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;KNN_실습&quot; data-og-description=&quot;keras dataset을 이용한 KNN 실습을 해보았다.KNN?KNN은 데이터 분류나 회귀에 사용되는 매우 직관적인 머신러닝 알고리즘이다.새로운 데이터가 들어왔을 때, 그 데이터와 가장 가까운 거리에 있는 k개&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dkim1540/KNN%EC%8B%A4%EC%8A%B5&quot; data-og-url=&quot;https://velog.io/@dkim1540/KNN실습&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uLUa9/dJMb9frLVqM/dU4v8M01bYG51R8sRy8ro0/img.png?width=1336&amp;amp;height=906&amp;amp;face=0_0_1336_906,https://scrap.kakaocdn.net/dn/7UIDF/dJMb9hC7IK7/mbOhOFfQP3rDzjpdbKgux1/img.png?width=1336&amp;amp;height=906&amp;amp;face=0_0_1336_906,https://scrap.kakaocdn.net/dn/vKnmo/dJMb9b3YwZI/bBPbg05uVA9e1TRNQ1WgQK/img.png?width=2902&amp;amp;height=612&amp;amp;face=0_0_2902_612&quot;&gt;&lt;a href=&quot;https://velog.io/@dkim1540/KNN%EC%8B%A4%EC%8A%B5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dkim1540/KNN%EC%8B%A4%EC%8A%B5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uLUa9/dJMb9frLVqM/dU4v8M01bYG51R8sRy8ro0/img.png?width=1336&amp;amp;height=906&amp;amp;face=0_0_1336_906,https://scrap.kakaocdn.net/dn/7UIDF/dJMb9hC7IK7/mbOhOFfQP3rDzjpdbKgux1/img.png?width=1336&amp;amp;height=906&amp;amp;face=0_0_1336_906,https://scrap.kakaocdn.net/dn/vKnmo/dJMb9b3YwZI/bBPbg05uVA9e1TRNQ1WgQK/img.png?width=2902&amp;amp;height=612&amp;amp;face=0_0_2902_612');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;KNN_실습&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;keras dataset을 이용한 KNN 실습을 해보았다.KNN?KNN은 데이터 분류나 회귀에 사용되는 매우 직관적인 머신러닝 알고리즘이다.새로운 데이터가 들어왔을 때, 그 데이터와 가장 가까운 거리에 있는 k개&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;velog에 작성해 두었다.&lt;/p&gt;</description>
      <category>cs/기계학습심화</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/34</guid>
      <comments>https://tro555.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 27 May 2026 20:00:33 +0900</pubDate>
    </item>
    <item>
      <title>RNN &amp;amp; Seq to Seq &amp;amp; LSTM</title>
      <link>https://tro555.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;RNN&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 이미지 처리에서 CNN에 대해 배웠다. 또한 잘 작동한다는 것을 알았다. (실습도 많이 해봤고)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7IdZg/dJMcaaSZDlg/umCjkkKkCzAVHoGepQZH20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7IdZg/dJMcaaSZDlg/umCjkkKkCzAVHoGepQZH20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7IdZg/dJMcaaSZDlg/umCjkkKkCzAVHoGepQZH20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7IdZg%2FdJMcaaSZDlg%2FumCjkkKkCzAVHoGepQZH20%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;1500&quot; height=&quot;744&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;744&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dihnxk/dJMcacJ4q1q/u3XAQo0Fkw01jrK0z1j6f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dihnxk/dJMcacJ4q1q/u3XAQo0Fkw01jrK0z1j6f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dihnxk/dJMcacJ4q1q/u3XAQo0Fkw01jrK0z1j6f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdihnxk%2FdJMcacJ4q1q%2Fu3XAQo0Fkw01jrK0z1j6f0%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;1230&quot; height=&quot;748&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 음파를 형태로 만들고, 음절 별로 구분해서 모델을 만들 수는 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 The sound라고 한다면, 기본적으로 이산적이고 모델에게 The까지인지 Thes까지인지 Theso까지인지 알려주기가 어렵다.&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; 앞선 CV를 처리하는 모델들도 이 순서라는 개념이 들어가있지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 실제 우리 말에는 '맥락'이라는 것도 존재한다. 이렇듯 언어 뿐만 아니라 우리 주위에는 '순서'라는 개념이 들어간 데이터가 많은데 이러한 시계열 데이터와 같은 '순서'가 중요한 데이터들을 가지고 모델을 만들고자 나온 것이 RNN이다.&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;RNN 파이프라인을 도식화하면 아래와 같다. 이미지를 넣어 언어로 출력하는 모델을 상상해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctUJdG/dJMcahR4naU/7U7PV1mWzZiw5bldoGySmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctUJdG/dJMcahR4naU/7U7PV1mWzZiw5bldoGySmK/img.png&quot; data-alt=&quot;one-to-many RNN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctUJdG/dJMcahR4naU/7U7PV1mWzZiw5bldoGySmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctUJdG%2FdJMcahR4naU%2F7U7PV1mWzZiw5bldoGySmK%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;1358&quot; height=&quot;698&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;one-to-many RNN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;one-to-many 방식이다. (many to one, many to many, one to one 전부 가능하다. 입력 벡터 대비 출력 벡터에 따른 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 x 벡터로 인코딩하고 이를 h(히든 레이어)로 보내 디코딩하여 I라는 글자를 추론한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서, &lt;b&gt;히든 레이어&lt;/b&gt;란 히든 스테이트로 만드는 레이어를 뜻하고, &lt;b&gt;히든 스테이트&lt;/b&gt;란, 지금까지 받은 정보를 요약해서 잠시 저장해두는 공간 정도로 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 다음 두 번째 히든레이어로 인코딩한 뒤(이전 '순서'에 대한 정보가 있다고 보면 된다) , 다시 디코딩하여 look이라는 글자를 추론하고,,, 를 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 각 인코딩 방식은 fc레이어로 생각하면 된다.(거의 fc레이어로 이루어져있다고 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fc레이어로 이루어져 있는 이유는, 실제 '시간'이나 '순서'에 대한 정보가 넘어가는게 중요하고 이 레이어를 지나는 과정 자체에서 뭔가를 얻고자 하는게 아니여서 그냥 단순 연산인 fc 레이어를 쓴다는 거 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOZgn/dJMcadWrCla/TNkAY0GKsJd9shFuYObvzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOZgn/dJMcadWrCla/TNkAY0GKsJd9shFuYObvzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOZgn/dJMcadWrCla/TNkAY0GKsJd9shFuYObvzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOZgn%2FdJMcadWrCla%2FTNkAY0GKsJd9shFuYObvzK%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;1364&quot; height=&quot;696&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;만약 사전의 모든 단어(6만개)를 6만 차원의 embedding vector로 one-hot encoding한다면 출력도 자유로울 텐데, 실제로는 데이터가 너무 방대해서 줄여야 한다. 이 때 두 가지 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, PCA나 autoencoder로 사이즈를 줄이는 방법이다. 다만 이러한 방법은 의미가 연관된 단어끼리 비슷하게 매핑이 안된다는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 a boy has 라는 문장에서 boy를 매핑한다면, 먼저 모래시계와 같은 구조에서 boy를 인코딩한 뒤, 디코딩 과정에서 일부는 a와, 다른 일부는 has와 연관지어 매핑하는 방법이 있다. (매핑 방식은 다양하다. 상황에 맞게 쓰면 됨)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBNpyq/dJMcad3brc0/dxcRXmtGnKlXkx0GifmzRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBNpyq/dJMcad3brc0/dxcRXmtGnKlXkx0GifmzRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBNpyq/dJMcad3brc0/dxcRXmtGnKlXkx0GifmzRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBNpyq%2FdJMcad3brc0%2FdxcRXmtGnKlXkx0GifmzRK%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;1596&quot; height=&quot;734&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;734&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;t가 시간이라면, t 시간에 x 벡터가 RNN으로 넘어가며 ht가 되고, 이전 t-1 시간에 인코딩 되었던 벡터가 들어오며 h(h(t-1) + h(t)가 될 것이다. 이로부터 디코딩 과정을 거쳐 y벡터가 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 상태 ht는 h(t-1)과 이전에서 넘어온 '순서'가 포함된 정보 x(t)를 어떤 가중치의 레이어에 통과시킨 값이 된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 activation func으로 tanh를 쓰는데, 그 이유는 글자라는 모든 값을 -1~1로 매핑하여 버려지지 않게 하기 위해서라고 한다.&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;&amp;nbsp;Seq to Seq&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 좀 더 복잡하게 만든 것이 seq2seq이다. RNN의 문제는 한글을 영어로 번역한다고 했을 때 실제 입력한 글자 수와 출력 글자 수가 다르거나, 입력의 첫 단어가 번역 시 동일하게 첫 어순으로 매칭되지 않는 상황에서 성능을 제대로 내지 못한다는 단점이 있다. 그래서 기존의 RNN 자체를 many to one과 one to many 두 개의 RNN으로 이어 붙여 각각 인코더와 디코더로서 하도록 만든 모델이다.&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;1646&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDYIA/dJMcai4tRUw/eXYaTmMutdj4VT1NxdNNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDYIA/dJMcai4tRUw/eXYaTmMutdj4VT1NxdNNI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDYIA/dJMcai4tRUw/eXYaTmMutdj4VT1NxdNNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDYIA%2FdJMcai4tRUw%2FeXYaTmMutdj4VT1NxdNNI1%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;1646&quot; height=&quot;678&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;678&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;gt; 벡터화의 인코딩의 가중치가 있고, 벡터 -&amp;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13cpC/dJMcaciUyja/rEFkhlGFCha5kK1Ecs0VVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13cpC/dJMcaciUyja/rEFkhlGFCha5kK1Ecs0VVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13cpC/dJMcaciUyja/rEFkhlGFCha5kK1Ecs0VVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13cpC%2FdJMcaciUyja%2FrEFkhlGFCha5kK1Ecs0VVk%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;1398&quot; height=&quot;744&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;744&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;하지만 아직도 여러 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 긴 문장을 넣게 되면 메모리를 엄청 잡아먹는다는 문제가 있었다. 또한 길이가 고정된 하나의 context 벡터로 인코딩하는 데엔 문장의 길이가 길면 한계가 있었다. 문장의 길이가 너무 길면 context vector에서 정보가 희미해지고 성능이 떨어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하려고 단락을 나누어 학습시킨다거나 이런 방법을 썼는데, 이러다가 나온게 바로 그 유명한 &lt;b&gt;attention&amp;nbsp;&lt;/b&gt;메커니즘이다. attention은 다음 글에서 정리하도록 하고 CNN과 RNN으로 만든 Image captioning 모델만 보여주고 다음 내용으로 넘어가겠다.&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;Image Captioning&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brZ3Mo/dJMcac4i53o/vKN30BYlgL8Eqvxq3in8l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brZ3Mo/dJMcac4i53o/vKN30BYlgL8Eqvxq3in8l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brZ3Mo/dJMcac4i53o/vKN30BYlgL8Eqvxq3in8l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrZ3Mo%2FdJMcac4i53o%2FvKN30BYlgL8Eqvxq3in8l0%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;1022&quot; height=&quot;604&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CNN 모델을 가지고 context vector로 만든 뒤 이를 RNN 디코더에 넣는 구조이다.&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;1438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9oEYb/dJMcadB4l7h/ZRWT6vzkMzLknZcUYSGKd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9oEYb/dJMcadB4l7h/ZRWT6vzkMzLknZcUYSGKd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9oEYb/dJMcadB4l7h/ZRWT6vzkMzLknZcUYSGKd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9oEYb%2FdJMcadB4l7h%2FZRWT6vzkMzLknZcUYSGKd0%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;1438&quot; height=&quot;428&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;428&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;RNN 구조를 조금 더 뜯어보면 사실 학습이 잘 안되는 구조라고 한다.(물론 이건 attention이랑 비교해서 하는 말이다.. ㅠㅠ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 가중치가 글자 수에 따라 계속 곱해지는 형태라 w가 계속 곱해져 값이 점점 커지게 되고, 이를 잡아주기 위해 activation func으로 tanh를 쓸 수밖에 없다.(LeRU 안쓰는 이유..)&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;그래서 나온게 LSTM이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LSTM&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSTM은 Long Short Term Memory로, 흔히 우리 인간의 뇌를 생각했을 때 장기기억 어쩌구~ 하는거를 본따 만들었다고 한다. 이 RNN의 구조를 일부 그대로 채용하고 있는데, 도식을 보면서 설명하겠다.&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;1396&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVVq6V/dJMcacpKqYF/GM0r42JfsOkMTXeUIj1laK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVVq6V/dJMcacpKqYF/GM0r42JfsOkMTXeUIj1laK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVVq6V/dJMcacpKqYF/GM0r42JfsOkMTXeUIj1laK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVVq6V%2FdJMcacpKqYF%2FGM0r42JfsOkMTXeUIj1laK%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;1396&quot; height=&quot;568&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;568&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;i,f,o,g는 스위치이다. on/off 스위치라고 생각하면 된다. 시그모이드 함수를 거쳐 on/off 여부를 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g는 우리가 앞서 배운 그 RNN이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c가 앞서 말한 장기기억 cell인데, 수식을 보면 저 식의 결과를 토대로 f,c 식에서는 장기기억을 얼만큼 지울지 정하고, 뒤의 i,g에서 현재 정보를 쓸지 말지를 정한다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h는 히든 스테이트로 이 장기기억 셀 c를 얼마만큼 꺼내쓸지 결정하는 구조이다.&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;사실 진짜 포인트는 '내부 구조가 더 중요해졌다'는 것이다. CNN에서도 복잡하면 기울기 소실 문제가 있어 학습이 되지 않았다. 그래서 skip connection(resnet)으로 해결하였다. 얘도 같은 원리로 RNN에서 발전된 형태인 것이다. 다음 시간엔 개인적으로 ML이 대중적이게 되는데 큰 역할을 한, ML의 꽃이라 생각하는 attention에 대해 알아보겠다.&lt;/p&gt;</description>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/33</guid>
      <comments>https://tro555.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 27 May 2026 19:59:29 +0900</pubDate>
    </item>
    <item>
      <title>자율주행 개발일지 03</title>
      <link>https://tro555.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pi0-FAST 모델 학습 결과 ADE/FDE가 6점대에서 2점대 중반까지 내려왔다. 하지만 마냥 좋지 않았다..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2492&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDjYNQ/dJMcacDimrU/fwuP2GmMnIKZUCz7gKSlk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDjYNQ/dJMcacDimrU/fwuP2GmMnIKZUCz7gKSlk1/img.png&quot; data-alt=&quot;html 기반 visualized한 첫 학습 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDjYNQ/dJMcacDimrU/fwuP2GmMnIKZUCz7gKSlk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDjYNQ%2FdJMcacDimrU%2FfwuP2GmMnIKZUCz7gKSlk1%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;2492&quot; height=&quot;1502&quot; data-origin-width=&quot;2492&quot; data-origin-height=&quot;1502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;html 기반 visualized한 첫 학습 결과&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;2492&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q85FI/dJMcaiQZfoc/yGtdKP5r1dCe3ZkE5SaQRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q85FI/dJMcaiQZfoc/yGtdKP5r1dCe3ZkE5SaQRk/img.png&quot; data-alt=&quot;전방에 장애물이 많으면 값이 튀는걸 볼 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q85FI/dJMcaiQZfoc/yGtdKP5r1dCe3ZkE5SaQRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq85FI%2FdJMcaiQZfoc%2FyGtdKP5r1dCe3ZkE5SaQRk%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;2492&quot; height=&quot;1476&quot; data-origin-width=&quot;2492&quot; data-origin-height=&quot;1476&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;로스는 성공적으로 떨어졌다. 하지만 데이터 전처리 과정에 문제가 있어 제대로 학습하지 못했다,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 target인 waypoint가 gps 절대좌표 상의 waypoint였고, 당연히 로컬 waypoint로는 추론이 불가능했던 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(보면 GT와 PRED 값의 시작점이 많이 벌어져있다. 절대좌표 vs 상대좌표이기 때문)&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;또한 실패 원인으로 input data로 [전방 이미지,&amp;nbsp; instruction, waypoint] 세 개를 주고, 데이터 셋도 적은 에피소드에서 동일한 상황으로 그 외 메트릭들을 filtering한 것이 크다고 생각했다.(유연하게 적용하지 못할 거니까 생각해보면 당연하다. 수학 문제도 새로운 유형을 많이 연습하지 않으면 풀지 못하지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poc 단계였어도 episode 하나를 정해 프레임을 잘라 학습시켰는데 이는 무모했던 것 같다,,&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-origin-width=&quot;1208&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSUUcm/dJMcaf7MMlX/dhL4guK6cA8h2Xxa0fKhIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSUUcm/dJMcaf7MMlX/dhL4guK6cA8h2Xxa0fKhIK/img.png&quot; data-alt=&quot;기존 실패 원인 분석들 ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSUUcm/dJMcaf7MMlX/dhL4guK6cA8h2Xxa0fKhIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSUUcm%2FdJMcaf7MMlX%2FdhL4guK6cA8h2Xxa0fKhIK%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;1208&quot; height=&quot;778&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;778&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 LeRobot yaaki-v3 dataset의 column들을 보면 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;observation.* : 모델 입력 후보
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;speed: ego 속도(단위 따로 없음)&lt;/li&gt;
&lt;li&gt;heading: 차량의 진행 방향(0~360 범위)&lt;/li&gt;
&lt;li&gt;heading_error: (기준 경로 대비 차량 heading 오차, 0.2인 값들이 많아 radian일 수 있음)&lt;/li&gt;
&lt;li&gt;hp_loc_latitude: 고정밀 위치 latitude&lt;/li&gt;
&lt;li&gt;hp_loc_longitude: 고정밀 위치 longtitude&lt;/li&gt;
&lt;li&gt;hp_loc_altitude: 고도&lt;/li&gt;
&lt;li&gt;acceleration_x: 촤량 좌표계 x축 가속도로 전후방향&lt;/li&gt;
&lt;li&gt;acceleration_y: 좌우방향
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서부터는 환경상태 컬럼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;state.lanes: 차선 수&lt;/li&gt;
&lt;li&gt;state.road: 도로 타입(고속도로 등)&lt;/li&gt;
&lt;li&gt;state.surface: 노면(아스팔트, 흙 등)&lt;/li&gt;
&lt;li&gt;state.max_speed: 제한속도(string 값임.. 왜지?)&lt;/li&gt;
&lt;li&gt;state.precipitation: 강수량, 강수 강도 계열&lt;/li&gt;
&lt;li&gt;state.conditions: 날씨 상태(clouds, clear, rain, snow)&lt;/li&gt;
&lt;li&gt;state.lighting: 조명 상태(day, dawn, dark)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서부터는 waypoints&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;state.waypoint: shape [10, 2]&lt;/li&gt;
&lt;li&gt;readme 설명 상 future waypoints는 openstreetmap graph에 snap된 미래 경로점&lt;/li&gt;
&lt;li&gt;longitude, latitude로 되어있음. (위의 고정밀 위치에서 이 값을 뺀 값을 상대 경로로서 예측하게 주면 될 거 같음)&lt;/li&gt;
&lt;li&gt;[waypoint_abs_lonlat -&amp;gt; ego position 기준 local ENU 좌표 -&amp;gt; ego heading 기준 rotate] - gpt 추천&lt;/li&gt;
&lt;li&gt;task.* : instruction/policy 조건
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;policy: student와 expert 두 종류(운전자의 숙련도로 보임)&lt;/li&gt;
&lt;li&gt;instructions: 자연어 instruction&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;action.* : 모방 학습의 정답 라벨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;continuous: float 라벨로 0,1,2 세 개의 index 존재&lt;/li&gt;
&lt;li&gt;가속 페달 입력, 브레이크 패달 입력, 조향각 세 개로 존재&lt;/li&gt;
&lt;li&gt;discrete: int 라벨로 기어와 방향지시등 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;샘플링 메타데이터들
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 컬럼 - 전방, 좌우 2개씩 , 후방 , 그리고 지도까지 총 7개&lt;/li&gt;
&lt;li&gt;timestamp, frame_index, episode_index, index - 시퀀스 정렬/샘플링용 메타데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 모델이 다양하게 학습할 수 있게 입력 모달리티를 추가했다. waypoint 예측을 고려했을 때, ego 값으로서 speed, heading_error, acceleration_x/y, max_speed를 추가하였다.&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;다음으로 ego 위치 값(0, 0)부터 시작해서 예측을 시키면 초기 값은 (0, 0)으로 고정되므로 Loss가 쉬워질 수 있는 것을 고려했다. 따라서 ego로부터 한 스텝 다음부터 시작하는 t+0.5s(실제 0.5초 간격은 아님)와 같은 한 스텝 다음 지점에서 시작하는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비디오를 보면 한 영상당 약 최대 30초 간격, 한 에피소드의 최대 시간. 평균 간격은 약 190프레임, 19초10fps이므로 0.5s를 프레임 단위로 잡고, offset은 5프레임 단위로 5, 10, 15, 20&amp;hellip; 으로 주고자 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 동일 에피소드 기준 마지막 지점에 도착 시 그 다음 값들이 없어 mask 처리가 되므로영상에서 마지막 부분은 자르고, 타겟 값만 주고자 한다. (10개의 웨이포인트를 찍으므로 5초 자름)또한 영상 평균 주기가 19초인데 정규분포를 따를 확률이 높아 5초로 통일하려 한다.&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;당연히 기존의 waypoint는 절대좌표였으므로 이번엔 lat과 lon, 그리고 heading 값으로 타겟 라벨을 상대좌표로 바꿔주었다.&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;마지막으로 filtering 과정을 거쳐 각 에피소드를 나누고, straitified sampling으로 골고루 뽑고, 이를 round-robin 방식으로 모델에게 골고루 먹여주고자 하였다.(어차피 LoRA이기 때문이다.)&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;아, 프레임도 각 에피소드별로 약 2hz로 제한을 두었다. 동일 에피소드에 여러 프레임이 필요없기도 하고, 무엇보다 우리 자원으로 너무 오래 걸리기 때문이다 ㅠㅠ&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;&lt;b&gt;모델 입력:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;observation.images.left_forward&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.images.front_left&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.images.right_forward&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[0] speed&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[6] acceleration_x&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[7] acceleration_y&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.max_speed&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;task.instructions&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;target 전처리용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[1] heading&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[3] hp_loc_latitude&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.vehicle[4] hp_loc_longitude&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.waypoints&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필터링/샘플링용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;task.policy&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;episode_index&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;frame_index&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;timestamp&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.road&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.surface&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.precipitation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.conditions&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.lighting&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.state.lanes&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일단 제외:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;heading_error&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hp_loc_altitude&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;action.continuous&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;action.discrete&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;observation.images.map&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터셋 filtering 기준&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;state.lanes = 1 or 2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;state.road = motorway, trunk, primary, secondary, tertiary 5개&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;state.surface = 아스팔트 고정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;max_speed = NA 제외 자유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;precipitation = 자유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;condition = clouds, clear 2 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;lighting = day 고정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;task.policy = expert 고정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;aciont - dont care&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;episode_index = straitified sampling로 에피소드 추추하고 이 안에서 2~3hz 정도 프레임 추출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에피소드 당 38프레임(2hz)에서 1000 에피소드 정도&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;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;</description>
      <category>개발 일지/자율주행 개발일지</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/32</guid>
      <comments>https://tro555.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 27 May 2026 18:31:42 +0900</pubDate>
    </item>
    <item>
      <title>졸업 프로젝트 11주차</title>
      <link>https://tro555.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번주에 고안한 C 언어 베이스 hook과 map, 그리고 이를 검출하는 로직의 명세를 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현한 팀원에게 참고하라고 명세를 작성한 터라 실제 구현은 조금 다르게 되었고, 이를 바탕으로 go기반 프로메테우스 연동 agent를 만들었다. 사실 고랭에 익숙하지 않아 대부분 codex가 만들어주었고, 설계도 구성과 환경변수 세팅, 주석처리 정도만 주로 한 거 같다.(codex 짱..!)&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;이번 주는 구현 위주로 하여 Git에 올린 것이 전부이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/weeeeestern/NetworkDoctor&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/weeeeestern/NetworkDoctor&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779448426241&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - weeeeestern/NetworkDoctor: eBPF와 Prometheus로 Kubernetes 네트워크 장애 신호를 수집하고 원인 후보를&quot; data-og-description=&quot;eBPF와 Prometheus로 Kubernetes 네트워크 장애 신호를 수집하고 원인 후보를 추론하는 Incident 진단 도구 - weeeeestern/NetworkDoctor&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/weeeeestern/NetworkDoctor&quot; data-og-url=&quot;https://github.com/weeeeestern/NetworkDoctor&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/weeeeestern/NetworkDoctor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/weeeeestern/NetworkDoctor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - weeeeestern/NetworkDoctor: eBPF와 Prometheus로 Kubernetes 네트워크 장애 신호를 수집하고 원인 후보를&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;eBPF와 Prometheus로 Kubernetes 네트워크 장애 신호를 수집하고 원인 후보를 추론하는 Incident 진단 도구 - weeeeestern/NetworkDoctor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 일지/졸업 프로젝트</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/31</guid>
      <comments>https://tro555.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 22 May 2026 20:13:48 +0900</pubDate>
    </item>
    <item>
      <title>VAE</title>
      <link>https://tro555.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번에 GAN에 대해 정리하였다. 오늘은 이보다 좀 더 앞선 VAE에 대해 다뤄보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VAE는 Autoencoder에 Variational을 붙인 Variational Autoencoder의 약자이다. 그렇다면 Autoencoder가 뭘까?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Ug2J/dJMcaii5PSJ/rgSQvzgN9ej9k7osmljwv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Ug2J/dJMcaii5PSJ/rgSQvzgN9ej9k7osmljwv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Ug2J/dJMcaii5PSJ/rgSQvzgN9ej9k7osmljwv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Ug2J%2FdJMcaii5PSJ%2FrgSQvzgN9ej9k7osmljwv1%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;886&quot; height=&quot;343&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;343&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;저 네모난 블랙박스를 기준으로 왼쪽 Encoding 부분과 오른쪽 Decoding 부분으로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽에 Input data를 넣어 encoding을 하여 더 작은 일명 'feature vector'로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;encoding layer는 conv layer로 구성된다.(정보는 정보대로 두며 크기를 줄이니까 당연히 conv 레이어일 것이다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 feature vector를 decoder로 다시 원상복구한다. (decoding layer는 당연히 deconv 레이어일 것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 복원하면 원본과 100% 동일하진 않지만 어느 정도 비슷한 퀄리티로 나온다고 하고, 본래 압축하는 용도로 많이 쓰였다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 원본과 얼마나 차이가 있는지를 &lt;b&gt;Reconstruction Loss&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;여기에서 우리가 관심있는건 encoder 부분 따로, decoder 부분 따로이다. 먼저 encoder로부터 나온 feature vector에 classifier를 달고 라벨을 준다면 어떤 의미를 capturing 하는 모델로 쓰기에 용이할 것이다.&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;그렇다면 decoder는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 배운 GAN을 다시 생각해보면, 무작위로 z를 뽑아 어떤 '확률 분포'를 토대로 '결과물을 생성'하였다. 그렇다면 위에서 Decoder 부분만 떼와서 feature vector z를 가지고 생성형 모델을 만들 수 있지 않을까 하는 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아쉽게도 바로는 불가능하다. 우선 입력값이 한정되어 있다. 즉 무작위로부터 decoding해서 나오는 결과물이 아니라는 것.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/52HYf/dJMcafmoVvZ/qAXl2Gkic9lRRhQTPF074k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/52HYf/dJMcafmoVvZ/qAXl2Gkic9lRRhQTPF074k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/52HYf/dJMcafmoVvZ/qAXl2Gkic9lRRhQTPF074k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F52HYf%2FdJMcafmoVvZ%2FqAXl2Gkic9lRRhQTPF074k%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;861&quot; height=&quot;274&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;274&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;실제 출력이 가능한 입력값은 저 파란 벡터들인데, 우리가 빨간 벡터를 준다면 decoding이 불가능할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 약간의 트릭이 필요하다. 바로 위의 파란 벡터들의 분포를 정규분포로 만드는 것이다. (앞서 배운 가우시안 정규분포의 workaround 기법을 사용면 될 거 같다.)&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;164&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiKdMo/dJMcag6Eqxu/C6NcRjTDPhs7op2MrJnp0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiKdMo/dJMcag6Eqxu/C6NcRjTDPhs7op2MrJnp0K/img.png&quot; data-alt=&quot;얘를&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiKdMo/dJMcag6Eqxu/C6NcRjTDPhs7op2MrJnp0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiKdMo%2FdJMcag6Eqxu%2FC6NcRjTDPhs7op2MrJnp0K%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;164&quot; height=&quot;128&quot; data-origin-width=&quot;164&quot; data-origin-height=&quot;128&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-origin-width=&quot;166&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXX7t/dJMcahRZ1HS/7Evs7QUhkEydA3c4jlPtJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXX7t/dJMcahRZ1HS/7Evs7QUhkEydA3c4jlPtJ1/img.png&quot; data-alt=&quot;이렇게&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXX7t/dJMcahRZ1HS/7Evs7QUhkEydA3c4jlPtJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXX7t%2FdJMcahRZ1HS%2F7Evs7QUhkEydA3c4jlPtJ1%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;166&quot; height=&quot;126&quot; data-origin-width=&quot;166&quot; data-origin-height=&quot;126&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;위처럼 정규분포로 바꿔주는 과정을 거쳐 만든 생성 모델이 VAE이다.&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;669&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO94Jb/dJMcahRZ1JN/rOeNrqeUNHxM4P1zqxV2Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO94Jb/dJMcahRZ1JN/rOeNrqeUNHxM4P1zqxV2Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO94Jb/dJMcahRZ1JN/rOeNrqeUNHxM4P1zqxV2Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO94Jb%2FdJMcahRZ1JN%2FrOeNrqeUNHxM4P1zqxV2Jk%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;669&quot; height=&quot;341&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mean Vector는 encoder로부터 추론한 확률분포의 중심 - (정규분포의 기준점이 될 것이다.)&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;Standard Deviation Vector는 이 추론한 확률분포의 분산 정도로 어느 정도 범위에서 z를 뽑을지 범위를 잡는 역할을 한다.&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;VAE에서 Loss function은 Reconstruction Loss에 KL divergence(mean, deviation)을 더한 형태로 이루어져 있다.&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;696&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpxRKj/dJMcagZQPHP/ypOfdu0xGJKLjmKAeZu9Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpxRKj/dJMcagZQPHP/ypOfdu0xGJKLjmKAeZu9Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpxRKj/dJMcagZQPHP/ypOfdu0xGJKLjmKAeZu9Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpxRKj%2FdJMcagZQPHP%2FypOfdu0xGJKLjmKAeZu9Mk%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;696&quot; height=&quot;286&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;286&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;딱봐도 모델이 단순하다. 이런 장점이 있지만 그만큼 퀄리티가 GAN이나 diffusion과 같은 다른 생성형 모델에 비해 안좋다고 한다.&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;834&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qot8h/dJMcaaejYi9/W5W3V6e5XTqzxkUtM1DfyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qot8h/dJMcaaejYi9/W5W3V6e5XTqzxkUtM1DfyK/img.png&quot; data-alt=&quot;VAE의 자세한 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qot8h/dJMcaaejYi9/W5W3V6e5XTqzxkUtM1DfyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqot8h%2FdJMcaaejYi9%2FW5W3V6e5XTqzxkUtM1DfyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;371&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VAE의 자세한 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/기계학습심화</category>
      <author>Woouuk</author>
      <guid isPermaLink="true">https://tro555.tistory.com/30</guid>
      <comments>https://tro555.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 21 May 2026 03:16:07 +0900</pubDate>
    </item>
  </channel>
</rss>