<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>miinkang's DEVLog</title>
    <link>https://miinkang.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 18:18:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>miinkang</managingEditor>
    <image>
      <title>miinkang's DEVLog</title>
      <url>https://tistory1.daumcdn.net/tistory/4796439/attach/cc190bf8b6294b82afcbd53143dece81</url>
      <link>https://miinkang.tistory.com</link>
    </image>
    <item>
      <title>[debugging] torchvison model 다운로드시 나타나는 WinError 10060 해결하기</title>
      <link>https://miinkang.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;torchvision에서 transfer learning model을 불러와 학습시키고자 할 때 해당 에러가 나올 수 있다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;model = models.resnet50(pretrained=True).to(device)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이렇게 모델을 가져오면, https://download.pytorch.org/models/모델명 링크를 통해 가져온다.&lt;br&gt;&lt;br&gt;이 때 WinError 10060 이 발생한다면, 직접 다운로드 받아 경로에 옮겨 모델을 사용할 수 있다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;torch.hub.get_dir()&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;1. 먼저, 위 코드를 입력해 어떤 경로에 다운로드 받아야하는지 확인한다. &lt;br&gt;&lt;br&gt;보통 로컬의 경우 'C://Users//사용자이름//.cache//torch//hub//checkpoints' 일 것이다. (윈도우)&lt;br&gt;&lt;br&gt;2. 확인한 후에 &lt;a href=&quot;https://download.pytorch.org/models/모델명&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://download.pytorch.org/models/모델명&lt;/span&gt;&lt;/a&gt; 해당 링크를 브라우저에 입력해 직접 다운로드 받는다.&lt;br&gt;&lt;br&gt;3. 받은 .pth 파일(모델 파일)을 해당 위치에 옮겨서 에러가 났던 코드를 다시 실행하면 무리없이 사용할 수 있다! &lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>torchvision.model</category>
      <category>torchvision.model 에러</category>
      <category>WinError 10060</category>
      <category>윈도우 WinError 10060</category>
      <category>파이토치 에러</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/32</guid>
      <comments>https://miinkang.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 24 Jul 2023 20:51:17 +0900</pubDate>
    </item>
    <item>
      <title>내적과 코사인 유사도</title>
      <link>https://miinkang.tistory.com/30</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;내적과 코사인 유사도가 어떤 연관이 있는지 정리해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;내적 (Dot product / Scalar product)&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;공식 : a &amp;bull; b = |a| * |b| * cos &amp;theta;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;코사인 유사도 (Cosine Similarity)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 벡터 사이의 각도를 계산해 두 벡터의 유사도를 측정하는 척도&amp;nbsp;&lt;/li&gt;
&lt;li&gt;1에 가까울수록 두 벡터가 유사하다고 해석&amp;nbsp;&lt;/li&gt;
&lt;li&gt;유사도는 두 벡터가 가리키는 방향의 유사도를 의미&amp;nbsp;&lt;/li&gt;
&lt;li&gt;방향이 같다면 코사인 유사도는 1, 직교한다면 0, 정반대의 방향이라면 -1로 표현한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코사인 유사도에서 내적&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내적의 공식을 다시 살펴보면, a &amp;bull; b = |a| * |b| * cos &amp;theta;이다.&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;코사인은 두 벡터가 직교하면 0, 90도보다 큰 각이면 음수값을 가진다.&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;&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;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJow5/btrXyp3ES1b/SnfhjWufS9kBEloPKnb6ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJow5/btrXyp3ES1b/SnfhjWufS9kBEloPKnb6ok/img.png&quot; data-alt=&quot;유클리드 거리 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJow5/btrXyp3ES1b/SnfhjWufS9kBEloPKnb6ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJow5%2FbtrXyp3ES1b%2FSnfhjWufS9kBEloPKnb6ok%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;244&quot; height=&quot;143&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;143&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;예시로 뉴질랜드의 지역 이름들의 유사도를 구해보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;오타와&quot;와 &quot;타우마 타와카탕이항아코아우아우오타마테아투리푸카카피키마웅아호로누쿠포카이웨누아키타나타후&quot;의&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt; 유사도를 구하고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;놀랍게도 두 단어 모두 뉴질랜드의 지명 이름이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;두 단어가 지명 이름이라는 것을 아는 순간, 인간은 직관적으로 두 단어의 공통점을 찾을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #373a3c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;컴퓨터로는 어렵기 때문에, 거리를 계산해서 유사도를 구하려고 유클리드 거리를 계산하면, 이 두 단어의 유사성은 아주 희박하게 계산될 것이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #373a3c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;코사인 유사도는 벡터의 양에 구애받지 않고, 성향(방향) 측면에서 유사성을 확인할 수 있기에 자연어처리에서 사용된다.&amp;nbsp;&lt;/span&gt;&lt;/span&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;</description>
      <category>ML &amp;amp; DL/NLP</category>
      <category>내적</category>
      <category>내적 자연어처리</category>
      <category>내적 코사인유사도</category>
      <category>자연어처리 코사인유사도</category>
      <category>코사인유사도</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/30</guid>
      <comments>https://miinkang.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 30 Jan 2023 18:26:36 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 메모리 관리 전략</title>
      <link>https://miinkang.tistory.com/29</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;물리 메모리와 가상 메모리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리 메모리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU는 물리 메모리에 적재된 코드만을 실행할 수 있다.&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;하드디스크 공간을 이용해 물리 메모리가 훨씬 커진 것처럼 사용하는 기술&lt;/li&gt;
&lt;li&gt;실제 공간 : 하드디스크 + RAM&lt;/li&gt;
&lt;li&gt;논리 메모리에 있는 프로세스를&amp;nbsp;실행할 때 필요한 부분만 물리 메모리에 로딩한다.&lt;/li&gt;
&lt;li&gt;논리적인 주소와 물리적인 주소를 매핑(mapping)하는 작업을 이용해 가상 메모리 기법을 사용한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-메모리-관리-전략&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-논리-메모리와-물리-메모리&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EB%85%BC%EB%A6%AC-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%99%80-%EB%AC%BC%EB%A6%AC-%EB%A9%94%EB%AA%A8%EB%A6%AC&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;논리 메모리와 물리 메모리&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-스와핑-swapping&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EC%8A%A4%EC%99%80%ED%95%91-swapping&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;스와핑 (Swapping)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리와 HDD, SSD 등의 보조 기억장치간에 프로세스를 이동시키는 것&lt;/li&gt;
&lt;li&gt;프로세스의 주소 공간을 일시적으로 디스크(보조 기억장치)로 내려놓는다.&lt;/li&gt;
&lt;li&gt;너무 많은 프로그램이 메모리에 동시에 올라와 메모리를 적게 사용해 성능이 떨어지는 것을 방지&lt;/li&gt;
&lt;li&gt;swap out 후 메모리에 있는 프로세스들이 충분히 실행된 후에 다시 swap in 한다.&lt;/li&gt;
&lt;li&gt;메모리 &amp;rarr; 보조 : swap out&lt;/li&gt;
&lt;li&gt;보조 &amp;rarr; 메모리 : swap in&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-중기-스케줄러-스와퍼-swapper&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EC%A4%91%EA%B8%B0-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC-%EC%8A%A4%EC%99%80%ED%8D%BC-swapper&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;중기 스케줄러 (스와퍼, Swapper)&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;프로세스에 할당된 메모리 주소 공간을 통째로 빼앗아 (프로세스 단위) 디스크의 스왑 영역으로 swap out 시킨다.&lt;/li&gt;
&lt;li&gt;메모리 공간에 여유가 생기면, 필요한 프로세스의 메모리 주소 공간을 swap in 시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-압축&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EC%95%95%EC%B6%95&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;li&gt;효율적이지 않기에 좋은 방법은 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;페이징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연속적으로 할당하지 않고, 페이지 단위로 나누어 프로세스를 올리는 방법&lt;/li&gt;
&lt;li&gt;단점 : 내부 단편화가 발생할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-세그멘테이션&quot; href=&quot;https://github.com/AInsteins/AI-Tech-Interview/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5%EC%97%90%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EB%8A%94%EC%A7%80-%EA%B0%84%EB%9E%B5%ED%9E%88-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.#%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&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;/ul&gt;</description>
      <category>가상메모리</category>
      <category>논리메모리</category>
      <category>메모리 관리 전략</category>
      <category>물리메모리</category>
      <category>세그멘테이션</category>
      <category>스와핑</category>
      <category>압축</category>
      <category>운영체제 메모리</category>
      <category>중기 스케쥴러</category>
      <category>페이징</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/29</guid>
      <comments>https://miinkang.tistory.com/29#entry29comment</comments>
      <pubDate>Mon, 17 Oct 2022 16:40:57 +0900</pubDate>
    </item>
    <item>
      <title>iterator와 lazy evaluation</title>
      <link>https://miinkang.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;면접 스터디에서 질문&amp;nbsp;&lt;b&gt;&lt;span style=&quot;letter-spacing: -1px;&quot;&gt;iterator와 iterable의 차이점은 무엇입니까?&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;letter-spacing: -1px;&quot;&gt;&amp;nbsp;에 대해 공부하다가 궁금증이 생겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: -1px;&quot;&gt;먼저 질문에 답을 해보자면,&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iterator
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iterable 객체를 순회하는 객체&lt;/li&gt;
&lt;li&gt;iter() : iterable 객체로부터 iterator를 생성하는 메소드&lt;/li&gt;
&lt;li&gt;next() : 메소드로 다음 요소를 탐색한다. (__next()__ 를 호출)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;iterable
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번에 하나씩 돌려줄 수 있는 특성
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iterable 한 객체 = 한 번에 하나씩 돌려줄 수 있는 객체라는 뜻 = 순회할 수 있는 객체&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;e.g. list, set, tuple, dictionary, string&lt;/li&gt;
&lt;/ol&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;또 중요한 점은 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;iterator는 항상 iterable 하지만, iterable 한 객체는 무조건 iterator가 되는 것은 아니라는 점이다.&lt;/span&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;* 순회&lt;/i&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료구조 내부의 요소를 하나씩 인덱싱하는 것을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663223185276&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sample_list = [1, 2, 3]

for element in sample_list:
	print(element)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;위 코드를 보면 쉽게 이해할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;반복문을 통해 요소를 불러오는 것을 &lt;b&gt;순회&lt;/b&gt;라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;파이썬 외에도 다른 언어에서도 통용되는 개념이라고 한다.&amp;nbsp;&lt;/span&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;span style=&quot;letter-spacing: 0px;&quot;&gt;iterable과 같이 생각해보면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;반복문을 사용할 수 있는, sample_list에 들어갈 수 있는 모든 자료구조는 순회가 가능하다.&lt;/span&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;span style=&quot;letter-spacing: 0px;&quot;&gt;그렇다면 iterable 한 객체의 예로 들었던 list, set, tuple등 iterable한 객체가 이미 있는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;왜 iterator를 생성하는 것일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iterator만이 갖는 특별한 장점이 무엇일까?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;lazy evaluation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게으른 연산이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iterable은 메모리에 배열에 크기에 해당하는 공간이 바로 할당된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 iterator는 생성할 당시에 할당하지 않는다.&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;iterator는 필요할 때마다 로딩하기 때문에 메모리를 절약할 수 있어 안정성이 담보된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J72Jh/btrMbw62LfX/aE6sESvQ2CNIp57OEKD1Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J72Jh/btrMbw62LfX/aE6sESvQ2CNIp57OEKD1Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J72Jh/btrMbw62LfX/aE6sESvQ2CNIp57OEKD1Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ72Jh%2FbtrMbw62LfX%2FaE6sESvQ2CNIp57OEKD1Y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;53&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;53&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;448&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5PPA/btrMbwMKh5I/oj8k7pPKsvtNKbssxY9kz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5PPA/btrMbwMKh5I/oj8k7pPKsvtNKbssxY9kz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5PPA/btrMbwMKh5I/oj8k7pPKsvtNKbssxY9kz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5PPA%2FbtrMbwMKh5I%2Foj8k7pPKsvtNKbssxY9kz1%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;448&quot; height=&quot;43&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;43&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;big_list는 list comprehension, big_gen은 generator comprehension이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;*generator : iterator를 생성하는 함수&lt;/i&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;list는 너무 큰 용량으로 인해 인터프리터가 종료되었으나, iterator는 오류없이 실행되었다.&lt;/div&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;- &lt;a href=&quot;https://shoark7.github.io/programming/python/iterable-iterator-generator-in-python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python] Iterable, Iterator 그리고 Generator&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://itholic.github.io/python-lazy-evaluation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[python] Lazy Evaluation&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>iterator generator</category>
      <category>iterator iterable 차이점</category>
      <category>iterator lazy evaluation</category>
      <category>iterator 사용 이유</category>
      <category>iterator 장점</category>
      <category>파이썬 iterable</category>
      <category>파이썬 iterator</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/28</guid>
      <comments>https://miinkang.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 15 Sep 2022 16:43:13 +0900</pubDate>
    </item>
    <item>
      <title>튜플 (Tuple)</title>
      <link>https://miinkang.tistory.com/27</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;튜플의 특징&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 변경이 불가능하다. (immutable)&amp;nbsp;&lt;/h4&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;효율성 때문에&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;용량이 적고, 접근이 빠르다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;따라서 변경할 일이 없다면 리스트보다 튜플을 사용하는 것이 보다 효율적임&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변경할 수 없기 때문에 정렬과 관련된 내장 함수를 사용할 수 없다. (e.g. sort(), reverse())&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;2. 여러 값에 대해 비교가 가능하다.&lt;/h4&gt;
&lt;pre id=&quot;code_1661497717972&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(0, 1, 2) &amp;lt; (5, 1, 2)
&amp;gt;&amp;gt;&amp;gt; True
('Apple', 'Juice') &amp;gt; ('Banana', 'Smoothie')
&amp;gt;&amp;gt;&amp;gt; False&lt;/code&gt;&lt;/pre&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;</description>
      <category>Python</category>
      <category>tuple python</category>
      <category>튜플</category>
      <category>튜플 리스트 차이점</category>
      <category>파이썬</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/27</guid>
      <comments>https://miinkang.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 26 Aug 2022 16:10:34 +0900</pubDate>
    </item>
    <item>
      <title>2. 도커 이미지, 네트워크</title>
      <link>https://miinkang.tistory.com/26</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;본 내용은 &lt;a href=&quot;https://opentutorials.org/course/4781&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;생활코딩-Docker 입구 수업&lt;/a&gt;을 공부하며 재정리한 내용입니다.&lt;br /&gt;잘못된 내용에 대한 의견은 댓글로 부탁드립니다. 감사드립니다. :-)&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;도커 이미지&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;imageblock&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqIW1/btrJSnjguGz/FcwuIko3IFrICOxNpAaBM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqIW1/btrJSnjguGz/FcwuIko3IFrICOxNpAaBM1/img.png&quot; data-alt=&quot;1.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqIW1/btrJSnjguGz/FcwuIko3IFrICOxNpAaBM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlqIW1%2FbtrJSnjguGz%2FFcwuIko3IFrICOxNpAaBM1%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;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;registry라는 docker hub에서 image를 Pull 한다. (download app on app store)&lt;/li&gt;
&lt;li&gt;image 실행(run)한다. &amp;rArr; container가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이미지란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램, 라이브러리, 실행파일, 소스 등을 설치한 후 만든 하나의 파일(을 저장한 형태)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;image를 run &amp;rArr; Image를 실행할 수 있는 container가 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Port Forwarding&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;web browser에서 web을 띄우기 위해서는 server에 web을 요청해야 한다.&lt;/li&gt;
&lt;li&gt;이때, port를 지정해서 원하는 파일을 server에 요청할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g. http://example.com&lt;b&gt;:80&lt;/b&gt;/index.html&lt;/li&gt;
&lt;li&gt;bold 처리된 번호(80)가 Port이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Container를 사용할 경우 Host와 Container를 연결해주어야 원하는 파일을 요청할 수 있다.&lt;/li&gt;
&lt;li&gt;Host와 Container를 연결해주는 것을 Port Forwarding이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660662988754&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$docker run -p 80:80 httpd
$docker run -p 80(host port):80(container port) httpd(image-name)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Docker &amp;amp; Kubernetes</category>
      <category>Port Forwarding</category>
      <category>도커</category>
      <category>도커 네트워크</category>
      <category>도커 이미지</category>
      <category>포트 포워딩</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/26</guid>
      <comments>https://miinkang.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 17 Aug 2022 08:18:39 +0900</pubDate>
    </item>
    <item>
      <title>1. 컨테이너, 도커, 쿠버네티스 구분하기</title>
      <link>https://miinkang.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글 클라우드의 퀵 랩(Qwiklabs)에서 Kubernetes in Google Cloud 코스를 실습했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실습하기 전에 컨테이너, 도커, 쿠버네티스 이 셋의 개념을 확실히 하기 위해 구글링 하며 정리해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://samsungsds.com/kr/story/220222_kubernetes1.html&quot;&gt;https://samsungsds.com/kr/story/220222_kubernetes1.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660661542175&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;쿠버네티스 알아보기 1편: 쿠버네티스와 컨테이너, 도커에 대한 기본 개념&quot; data-og-description=&quot;요즘 IT 생태계에 관심이 많으신 분들이라면 쿠버네티스라는 단어를 들어 보셨을 텐데요. 쿠버네티스에 대해 개발자들의 관심이 높아지고 있고, 여러 대기업에서 새로운 시스템을 쿠버네티스를&quot; data-og-host=&quot;samsungsds.com&quot; data-og-source-url=&quot;https://samsungsds.com/kr/story/220222_kubernetes1.html&quot; data-og-url=&quot;https://samsungsds.com/kr/story/220222_kubernetes1.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XOntx/hyPsRZXUGF/YVrxb0AynEB4BSnKlvUZcK/img.jpg?width=900&amp;amp;height=600&amp;amp;face=0_0_900_600,https://scrap.kakaocdn.net/dn/ldAVb/hyPsIISa0N/s4wnE9ggTxR1Z1uDrVSbIK/img.jpg?width=844&amp;amp;height=368&amp;amp;face=0_0_844_368,https://scrap.kakaocdn.net/dn/cAVL5v/hyPsK7Fis7/9YnfP14O8dKR1XpsS5bmS1/img.jpg?width=844&amp;amp;height=337&amp;amp;face=0_0_844_337&quot;&gt;&lt;a href=&quot;https://samsungsds.com/kr/story/220222_kubernetes1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://samsungsds.com/kr/story/220222_kubernetes1.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XOntx/hyPsRZXUGF/YVrxb0AynEB4BSnKlvUZcK/img.jpg?width=900&amp;amp;height=600&amp;amp;face=0_0_900_600,https://scrap.kakaocdn.net/dn/ldAVb/hyPsIISa0N/s4wnE9ggTxR1Z1uDrVSbIK/img.jpg?width=844&amp;amp;height=368&amp;amp;face=0_0_844_368,https://scrap.kakaocdn.net/dn/cAVL5v/hyPsK7Fis7/9YnfP14O8dKR1XpsS5bmS1/img.jpg?width=844&amp;amp;height=337&amp;amp;face=0_0_844_337');&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;쿠버네티스 알아보기 1편: 쿠버네티스와 컨테이너, 도커에 대한 기본 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요즘 IT 생태계에 관심이 많으신 분들이라면 쿠버네티스라는 단어를 들어 보셨을 텐데요. 쿠버네티스에 대해 개발자들의 관심이 높아지고 있고, 여러 대기업에서 새로운 시스템을 쿠버네티스를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;samsungsds.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 페이지의 내용을 참고했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못된 내용에 대한 의견은&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글로 부탁드립니다. 감사드립니다. :-)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 포스트 &lt;a href=&quot;https://miinkang.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;0. Docker란?&lt;/b&gt;&lt;/a&gt; 에서 컨테이너는 app이 실행되는 격리된 공간이라고 정리했습니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS를 공유하는 방식&lt;/li&gt;
&lt;li&gt;한 프로그램의 문제가 다른 프로그램을 간섭할 수 없음&lt;/li&gt;
&lt;li&gt;프로그램의 문제 &amp;rarr; OS 영향을 미친다면 OS에서 구동중인 전체 컨테이너의 문제가 될 수 있음&lt;/li&gt;
&lt;li&gt;프로그램을 독립된 환경에서 실행하는 것처럼 격리시켜준다.&lt;/li&gt;
&lt;li&gt;CPU나 메모리 등 저장 장치와 같은 자원도 실행한 프로그램이 독립적으로 쓸 수 있도록 해준다.&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;829&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEV5W8/btrJQ28gtme/fCj7zdzxPkWHVoVdOFI6g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEV5W8/btrJQ28gtme/fCj7zdzxPkWHVoVdOFI6g0/img.png&quot; data-alt=&quot;가상머신 기반과 컨테이너 기반 배포를 비교해서 볼 것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEV5W8/btrJQ28gtme/fCj7zdzxPkWHVoVdOFI6g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEV5W8%2FbtrJQ28gtme%2FfCj7zdzxPkWHVoVdOFI6g0%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;829&quot; height=&quot;386&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;386&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;그럼 컨테이너, 도커, 쿠버네티스 이 셋은 각각 어떤 역할을 하는 것일까요?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너 | 도커 | 쿠버네티스&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. &lt;b&gt;컨테이너&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; 해당 애플리케이션을 실행하기 위한 환경 설정이 필요함 &amp;rarr; 애플리케이션과 필요한 환경까지 감싸서 (마치 애플리케이션이 환경을 소유하고 있는 것처럼 보이게 한다.) 환경에 구애받지 않고 실행이 가능하게 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 컨테이너 런타임 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너를 사용하기 위해 필요한 도구 Ex) &lt;b&gt;도커&lt;/b&gt; (가장 유명한 컨테이너 런타임)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. &lt;b&gt;쿠버네티스&lt;/b&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;a.k.a 컨테이너 오케스트레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;&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>Docker &amp;amp; Kubernetes</category>
      <category>구글 클라우드</category>
      <category>도커</category>
      <category>컨테이너</category>
      <category>컨테이너 런타임</category>
      <category>쿠버네티스</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/25</guid>
      <comments>https://miinkang.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 17 Aug 2022 00:05:40 +0900</pubDate>
    </item>
    <item>
      <title>0. Docker란?</title>
      <link>https://miinkang.tistory.com/24</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;본 내용은 &lt;a href=&quot;https://opentutorials.org/course/4781&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;생활코딩-Docker 입구 수업&lt;/a&gt;을 공부하며 재정리한 내용입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI/ML 프로젝트를 진행하면서 환경설정의 어려움을 겪었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 팀 단위 프로젝트를 할 때, 각자의 OS, 프로그램 버전 등 모든 환경이 달라 같은 모델도 동작하지 않을 때가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 매번 버전을 맞추는 등 수고를 했는데, 이런 것들을 편리하게 해결할 수 있는 것을 알게 되었고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 Docker! 였습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 위 링크에 있는 Docker 입구 수업을 들으며, 모르는 부분은 찾아가며 정리해보았습니다.&amp;nbsp;&lt;/p&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;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;app을 배포하고자 한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;web server, db가 필요하다.&lt;/li&gt;
&lt;li&gt;각 OS와 app에 필요한 버전 관리를 해야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;버전 관리를 어떻게 할 수 있을까? 방법은?
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 컴퓨터 위에 가상 컴퓨터를 만든다.&lt;/li&gt;
&lt;li&gt;가상 컴퓨터 안에 OS와 web server, db를 설치한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vmware, Virtualbox 등이 이것과 같다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;but, os는 매번 설치하기에 너무 크고, OS위에 OS? 비효율적이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;그럼 이건?
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1대의 컴퓨터에서 각각의 app을 실행시킨다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 app은 각각 격리된 공간에서 실행된다.&lt;/li&gt;
&lt;li&gt;OS가 설치된 컴퓨터 (1대의 컴퓨터) &amp;rArr; Host라고 칭한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;app이 실행되는 격리된 공간 &amp;rArr; Container라고 칭한다.&amp;nbsp;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Container : app이 실행될 수 있는 Library이다. 실행파일들이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Host에 이미 설치된 OS를 Contatiner들이 공유한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS를 재설치할 필요가 없어서 가볍고, 속도가 빠르다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Docker : Container를 사용하기 위해 필요한 도구(Container Runtime) 중 유명한 것!&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Docker &amp;amp; Kubernetes</category>
      <category>docker</category>
      <category>도커</category>
      <category>도커 컨테이너</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/24</guid>
      <comments>https://miinkang.tistory.com/24#entry24comment</comments>
      <pubDate>Tue, 16 Aug 2022 23:35:52 +0900</pubDate>
    </item>
    <item>
      <title>[논문리뷰] Sequence to Sequence Learning with Neural Networks</title>
      <link>https://miinkang.tistory.com/23</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;본 게시물은 &lt;a href=&quot;https://arxiv.org/pdf/1409.3215.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sequence to Sequence Learning with Neural Networks&lt;/a&gt;를 요약 및 번역 정리한 내용입니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. Abstract&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어려운 학습 과제에도 좋은 성과를 내는 Deep Neural Networks(DNNs)는 대용량의 지도 학습 데이터셋에는 잘 적용되지만 시퀀스를 잇는(mapping) 학습에는 사용될 수 없다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;시퀀스 학습의 일반적인 end-to-end 접근법을 제안하고자 한다. 해당 접근법은 시퀀스 구조에 대해 최소한의 추정을 하는 방법이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;입력 시퀀스를 고정된 차원의 벡터로 매핑하기 위한 다층의 Long Short-Term Memory (LSTM)을 사용한다.&lt;/li&gt;
&lt;li&gt;벡터로부터 타겟 시퀀스를 디코딩하는 또 다른 다층의 LSTM을 사용한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;논문에서 사용할 태스크는 영어-프랑스어 번역이다. (데이터셋 : WMT' 14 dataset)&lt;/li&gt;
&lt;li&gt;모델 평가는 BLEU 스코어를 이용한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;타겟 문장을 제외한 입력 문장의 단어 순서를 뒤집는 것이 LSTM의 성과를 개선한다는 것을 발견했다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;단어 순서를 뒤집으면서 인풋 문장과 타겟 문장 사이에 많은 의존도를 도입하게 되고, 이로 인해 문제를 최적화할 수 있었다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Introduction&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) Deep Neural Networks(DNNs)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음성 인식, 사물 인식 등의 어려운 문제에 대해 좋은 성능을 갖고 있는 모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적당한 단계의 임의의 병렬 계산이 가능하기 때문&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이차 크기의 히든 레이어 2개만을 사용해 N-비트의 수를 정렬할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;대형 DNNs은 label된 학습 셋이 네트워크의 파라미터를 구체화할 수 있을 정도의 충분한 정보를 갖고 있다면,&lt;br /&gt;지도 역전파를 이용해 학습시킬 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;하지만, 입력과 타겟이 고정된 차원의 벡터로 인코딩 된 문제에만 적용할 수 있다는 한계가 있다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) sequential problems&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음성 인식, 기계 번역 등 많은 문제들은 길이를 알 수 없는 시퀀스로 잘 표현된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;question-answering 문제는 질문을 대표하는 단어들의 시퀀스를 정답을 대표하는 단어들의 시퀀스로 매핑해야 한다.&lt;/li&gt;
&lt;li&gt;위와 같은 문제처럼 영역에 구애받지 않으면서 시퀀스를 시퀀스로 매핑하는 것을 학습하는 방법이 유용하다는 것을 알 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;DNNs는 입력과 출력의 차원을 알 수 있어야 하며, 고정되어야 하기 때문에 시퀀스를 해결하기에는 어려움이 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이 논문에서 Long Short-Term Memory (LSTM) 아키텍처가 일반적인 sequence to sequence 문제를 해결할 수 있다는 것을 보여주고자 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) Idea with Long Short-Term Memory (LSTM)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 시퀀스를 읽는 데에 LSTM을 한 번 사용한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이를 통해 고정된 차원의 벡터 표현을 얻을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또 다른 LSTM을 이용해 벡터에서 출력 시퀀스를 추출한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 번째 LSTM은 recurrent neural network 언어 모델이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LSTM은 입력과 입력에 대응하는 출력 사이의 시간 차로 인해 긴 범위의 일시적인 의존성을 학습한다.&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;818&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oZf6e/btrvDgMwHdu/ss9ar8ZxiUYn4m2DLVSaN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oZf6e/btrvDgMwHdu/ss9ar8ZxiUYn4m2DLVSaN1/img.png&quot; data-alt=&quot;입력 시퀀스 : 'ABC', 출력 시퀀스 : 'WXYZ'&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oZf6e/btrvDgMwHdu/ss9ar8ZxiUYn4m2DLVSaN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoZf6e%2FbtrvDgMwHdu%2Fss9ar8ZxiUYn4m2DLVSaN1%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;818&quot; height=&quot;180&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입력 시퀀스 : 'ABC', 출력 시퀀스 : 'WXYZ'&amp;amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. The model&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) RNN의 한계&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 시퀀스가 주어지면, Recurrent Neural Network (RNN)은 출력 시퀀스를 아래 수식을 이용해 계산한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bym2dV/btrvLBvE7UM/4R0MSrcs85g8nVfhXGUxtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bym2dV/btrvLBvE7UM/4R0MSrcs85g8nVfhXGUxtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bym2dV/btrvLBvE7UM/4R0MSrcs85g8nVfhXGUxtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbym2dV%2FbtrvLBvE7UM%2F4R0MSrcs85g8nVfhXGUxtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;62&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;62&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;RNN은 입력과 출력 사이의 정렬을 미리 알 수 있을 때마다 시퀀스와 시퀀스를 쉽게 매핑할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;그러나, 입력과 출력 시퀀스가 서로 다른 길이를 갖고 있는 문제에 대해 적용하는 방법이 명확하지 않다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;일반적인 시퀀스 학습을 위한 가장 간단한 전략은 하나의 RNN을 사용해 입력 시퀀스를 고정 사이즈의 벡터로 매핑하고, 또다른 RNN을 사용해 벡터를 타겟 시퀀스로 매핑하는 것이다.&lt;/li&gt;
&lt;li&gt;하지만 이 방법은 Long term dependency라는 문제를 야기할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Long Term Dependency (장기 의존성 문제) : 1보다 작은 값을 반복적으로 곱하는 수식이기 때문에 문장이 길어질수록 앞의 정보를 뒤까지 전달하기 어려운 문제가 일어난다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 Long term dependency 문제를 해결할 수 있는 LSTM으로 해당 문제를 학습해보고자 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) LSTM&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LSTM은 길이가 서로 다른 입력 문장과 출력 문장의 조건부 확률을 추정한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;LSTM의 마지막 히든 스테이트에서 나온 입력 문장의 고정된 차원적 표현인 v를 구함으로써 조건부 확률을 계산한다.&lt;/li&gt;
&lt;li&gt;초기 히든 스테이트가 v로 설정된 표준 LSTM-LM 공식을 사용해 출력 문장의 확률을 계산한다.&lt;/li&gt;
&lt;li&gt;각 분포는 단어 사전 안에 있는 모든 단어의 소프트맥스 값으로 표현된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;각 문장은 end-of-sentence 상징인 &quot;&amp;lt;EOS&amp;gt;&quot; 토큰으로 끝난다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 토큰을 이용해 문장의 끝을 알 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;입, 출력 문장 모두 해당 토큰으로 끝난다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 모델 특징&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력 문장, 출력 문장에 해당하는 두 개의 다른 LSTM 모델을 사용한다.&lt;br /&gt;&amp;gt; 두 개의 모델을 사용하는 것이 계산되는 모델 파라미터 수가 미미한 정도로 늘어나고, 복수의 언어를 동시에 학습시키는 것이 더 자연스럽기 때문이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;좁은 LSTM 보다 넓은 LSTM이 두드러지게 좋은 성과를 냈다는 것을 알아냈다.&amp;nbsp;&lt;br /&gt;&amp;gt; 4개 층의 LSTM을 사용함&lt;/li&gt;
&lt;li&gt;입력 문장의 단어의 순서를 뒤집는 것이 굉장히 가치 있다는 것을 알아냈다.&amp;nbsp;&lt;br /&gt;&amp;gt; a, b, c : &amp;alpha;, &amp;beta;, &amp;gamma; 가 아닌 c, b, a : &amp;alpha;, &amp;beta;, &amp;gamma;로 매핑하는 것&amp;nbsp;&lt;br /&gt;&amp;gt; 이렇게 뒤집음으로써 SGD가 입력과 출력 사이의 커뮤니케이션을 쉽게 만들 수 있음&lt;br /&gt;&amp;gt; 간단한 데이터 변형이 LSTM 성능 향상에 큰 도움을 줄 수 있었음&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Experiments, 실험 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 데이터셋&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 : WMT' 14 영어 -&amp;gt; 불어 기계번역&lt;/li&gt;
&lt;li&gt;데이터셋 :&amp;nbsp; WMT&amp;rsquo; 14 영어-불어 데이터셋&lt;/li&gt;
&lt;li&gt;16만 개의 빈도 높은 단어(소스 언어)와 8만개의 빈도높은 단어(타겟 언어)를 사용해 단어 사전 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Decoding and Rescoring&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MBjj1/btrwA5Kp89z/QLKP11Tk30KvVJ8XkFkDuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MBjj1/btrwA5Kp89z/QLKP11Tk30KvVJ8XkFkDuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MBjj1/btrwA5Kp89z/QLKP11Tk30KvVJ8XkFkDuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMBjj1%2FbtrwA5Kp89z%2FQLKP11Tk30KvVJ8XkFkDuk%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;189&quot; height=&quot;59&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;59&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;log 확률을 최대화하도록 학습&lt;/li&gt;
&lt;li&gt;T : 올바른 번역&lt;/li&gt;
&lt;li&gt;S : 소스 문장&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;left-to-right 빔 서치 디코더를 이용해 번역 문장을 생성한다.&lt;/li&gt;
&lt;li&gt;각 단계마다 단어 사전의 모든 단어와 함께 빔의 부분 가설(번역 단어)을 확장한다.&lt;/li&gt;
&lt;li&gt;확장된 가설 중 가장 가능성이 있는 번역이 log 확률에 따라 선택되며, 나머지는 버려진다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&quot;&amp;lt;EOS&amp;gt;&quot; 토큰 (End Of Sentence)이 번역에 더해지면 빔에서 제거 후 완성된 번역 문장에 더해진다.&lt;/li&gt;
&lt;li&gt;디코더는 거의 정확한 반면에 시행하기에 간단하다.&lt;/li&gt;
&lt;li&gt;빔 사이즈 1일 때 성과가 좋았으며 빔 사이즈 2는 빔 서치의 이점을 거의 다 제공한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LSTM을 사용해 베이스라인의 1000개의 목록을 rescoring 했다.&amp;nbsp; &amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 가설의 log 확률을 계산한 후 베이스라인의 점수와 LSTM의 점수의 평균을 취했다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 문장 뒤집기&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;소스 문장을 뒤집어 학습함으로써 모델의 test perplexity(낮을수록 좋은 성능)가 5.8에서 4.7로 떨어지고, BLEU 스코어는 25.9에서 30.6으로 오르는 성과를 보여줌&amp;nbsp;&lt;/li&gt;
&lt;li&gt;문장을 뒤집음으로써 long term dependency 문제를 해결할 수 있다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존에는 minimal time lag 문제로 인해 소스 문장의 단어들이 그에 상응하는 타겟 문장의 단어와 거리가 멀었다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;소스 문장을 뒤집는다면, 평균적인 단어 간의 거리는 같지만 처음 나오는 몇 단어들이 타겟 문장의 단어와 매우 가깝기 때문에 minimal time lag 문제가 상당 부분 줄어들 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ML &amp;amp; DL/논문</category>
      <category>seq2seq</category>
      <category>seq2seq 논문</category>
      <category>seq2seq 논문리뷰</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/23</guid>
      <comments>https://miinkang.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 24 Mar 2022 12:50:47 +0900</pubDate>
    </item>
    <item>
      <title>Word Embedding Association Test (WEAT) - 편향성 측정</title>
      <link>https://miinkang.tistory.com/22</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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WEAT test는 데이터가 얼마나 편향적인지를 확인할 수 있는 계산식이다.&amp;nbsp;&lt;br /&gt;&lt;br /&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;변환된 워드 임베딩(word embedding) 간의 거리를 이용해 해당 데이터셋의 편향 정도를 측정할 수 있다.&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;- target 단어와 attribute 단어들로 분류한다.&amp;nbsp;&lt;br /&gt;(e.g. target : attribute = flower : happy = insect : disgusting)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 예시처럼 상반되는 두 target 데이터셋(해당 단어를 대표하는 단어들)을 잇고, 상반되는 두 attribute 데이터셋(해당 단어를 대표하는 단어들)을 이어 두 축을 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 두 target 단어가 두 attribute 단어의 축까지의 거리가 같을 수록 편향이 적다고 할 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL/NLP</category>
      <category>WEAT</category>
      <category>단어 편향성</category>
      <author>miinkang</author>
      <guid isPermaLink="true">https://miinkang.tistory.com/22</guid>
      <comments>https://miinkang.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 8 Nov 2021 17:50:01 +0900</pubDate>
    </item>
  </channel>
</rss>