<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>woojin_22.log</title>
        <link>https://velog.io/</link>
        <description>ㅋㄷ</description>
        <lastBuildDate>Tue, 27 Jun 2023 06:32:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>woojin_22.log</title>
            <url>https://velog.velcdn.com/images/woojin_22/profile/69c27477-4b33-4d13-8929-e46dab0057d5/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. woojin_22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/woojin_22" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[파이썬 OOP]]></title>
            <link>https://velog.io/@woojin_22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-OOP</link>
            <guid>https://velog.io/@woojin_22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-OOP</guid>
            <pubDate>Tue, 27 Jun 2023 06:32:04 GMT</pubDate>
            <description><![CDATA[<p>OOP : Object Oriented Programming(객체 지향 프로그래밍)
기본 전제는 기능(함수, 변수) 재사용이 가능하도록 설계 및 프로그래밍 했는지</p>
<p>대부분의 분야에서 OOP의 개념을 적용하여 프로그래밍을 수행
기본 개념 : 설계(사람이 이해하는 방식)와 구현할 소스코드(컴퓨터가 이해하는 방식) 간의 상호이해가 중요</p>
<ul>
<li>OOP의 개념을 무분별하게 활용하면 유지보수가 어려워질 수도 있다</li>
</ul>
<h3 id="oop-이전">OOP 이전</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/d48cb9ce-649a-4f81-b261-c70cb403e732/image.png" alt=""></p>
<ul>
<li>배열과 함수, 변수를 많이 생성하고 활용하여 최대한 많은 기능을 적은 양의 소스코드파일에 담았다</li>
<li>속성과 기능이 증가할때 마다 배열과 함수를 계속 생성해야했기 때문에 비효율</li>
</ul>
<h3 id="oop의-필요성">OOP의 필요성</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/eaa74d0a-15a1-4814-9d2a-1a20ac6440df/image.png" alt=""></p>
<p>함수형은 함수의 사용을 극대화시켜서 코드의 가독성을 높여주는 형태
실제로 머릿속에서 떠올릴 수 있는 것을 프로그래밍하는 것이 OOP의 중점
기능별로 개체가 효율적으로(재사용가능하도록) 분리되어야 한다, 따라서 설계가 중요</p>
<h2 id="oop의-구성">OOP의 구성</h2>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/8d768649-dccf-46f9-af74-4d2d672f9d21/image.png" alt="">
OOP를 활용할 때의 특징</p>
<ul>
<li>PEP와 같이 여러사람과 함께 일관적인 코드맥락 유지 가능</li>
<li>복잡한 프로그래밍에 대해 함수나 클래스를 활용하여 오류발생확률 감소<h3 id="oop와-python">OOP와 Python</h3>
</li>
</ul>
<ol>
<li>파이썬의 자료형은 하나의 클래스이다</li>
</ol>
<ul>
<li><code>.method</code> 형태로 활용되는 코드들은 해당 자료형 클래스에 구현된 메소드이다</li>
<li>각 자료형 클래스의 메소드는 <code>help(&#39;자료형&#39;)</code>으로 확인할 수 있다</li>
</ul>
<ol start="2">
<li>예시 : <code>category_encoders</code> 라이브러리의 <code>OneHotEncoder</code></li>
</ol>
<h3 id="캡슐화">캡슐화</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/d1660d69-2612-4cb3-8d33-cf1a2a8e7784/image.png" alt="">
내부 속성(변수)과 함수를 하나로 묶어서 클래스로 선언하는 일반적인 개념</p>
<ul>
<li>캡슐화형태로 코드를 작성하지 않으면 특정 기능(함수, 변수)에 직접 접근하게 되는 상황</li>
<li>기능이 많아질수록 재사용의 개념을 활용하기가 어려움</li>
</ul>
<h3 id="상속과-포함">상속과 포함</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/dad2f0ce-050b-4022-9d71-226c43131f89/image.png" alt=""></p>
<ul>
<li><p>object의 종류는 현실 세계에 있는 대부분이기 대문에, 설계될 수 있는 다양한 object가 있다</p>
</li>
<li><p>상속(Inheritance)</p>
</li>
</ul>
<pre><code>&quot;개는 동물이다.&quot; 또는 &quot;선생님은 직장인이다.&quot;라는 관계로서 설명된다.

기본개념 : 상위 클래스의 모든 기능(함수, 변수)을 재사용할 수 있다</code></pre><ul>
<li>포함<pre><code>&quot;개는 몸을 갖고 있다.&quot; 라는 관계로서 설명된다.
</code></pre></li>
</ul>
<p>기본개념 : 다른 클래스의 일부 기능(함수)만을 재사용한다.</p>
<pre><code>
### 추상화
![](https://velog.velcdn.com/images/woojin_22/post/a3faf1df-7ec8-4513-b622-4e8b19d23113/image.png)
추상화는 복잡한 내용에서 핵심적인 개념 및 기능을 요약하는 것
+ object의 기능에 따라 추상클래스(상위클래스)를 상속받아 개별적으로 클래스(하위클래스)를 생성한다
+ 기본적으로 추상메소드를 선언하며 실제 실행되는 기능은 **보여지지 않는다**
+ 실제 실행되는 기능은 선언된 추상클래스를 상속받은 다른 클래스의 메소드에서 확인할 수 있다
+ 추상클래스를 사용하는 이유
    클래스 또는 함수가 예상했던 것 이상으로 많이 생성되는 경우 추상클래스를 생성하여 핵심적인 기능만 생성해놓는다
    실제로 동작기능은 추상클래스에서 상속받은 하위클래스의 메소드에서 진행된다
    추상클래스의 추상메소드를 활용할 때 장점은 추상클래스를 중심으로 하위클래스의 메소드를 다양하게 생성할 수 있기 때문에, 유지보수를 진행하는 경우 추상클래스만 수정하면 되므로 복잡성을 낮출 수 있다

### 다형성
OOP에서 다형성은 계층 구조의 상속 관계에서 상속받은 기능 외, 다른 기능을 추가적으로 제공하고자 할 때 사용한다
* 장점 : 프로그램 작성 코드량을 줄여준다, if/else문을 많이 줄일 수 있다, 가독성 상승








</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[N334] GAN(Generative Adversarial Networks)]]></title>
            <link>https://velog.io/@woojin_22/N334-GANGenerative-Adversarial-Networks</link>
            <guid>https://velog.io/@woojin_22/N334-GANGenerative-Adversarial-Networks</guid>
            <pubDate>Mon, 08 May 2023 09:40:52 GMT</pubDate>
            <description><![CDATA[<h1 id="gangenerative-adversarial-networks">GAN(Generative Adversarial Networks)</h1>
<p>딥페이크의 기반이 되는 GAN</p>
<h2 id="gan이란">GAN이란?</h2>
<p>생성적 적대 신경망, 실제와 유사한 데이터를 만들어내는 생성 모델
위조지폐 예시
<img src="https://velog.velcdn.com/images/woojin_22/post/aeb7b8aa-68f8-4372-add4-ef9adb43a4f4/image.png" alt="">
위조지폐범에 해당하는 생성자(Generator)는 실제와 동일한 데이터를 만들기 위해 노력
탐정에 속하는 판별자(Discriminator)는 생성된 데이터가 진짜인지 아닌지 판단
처음에는 성능이 좋지 않지만 학습을 거듭하며 점점 발전</p>
<h3 id="그림을-그리는-gan">그림을 그리는 GAN</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/59020439-98f0-44ee-ad1e-1a56ced5faca/image.png" alt="">
생정자는 Random Noise로부터 실제 고양이 그림과 유사한 그림을 생성
판별자는 생성자가 만들어낸 고양이 그림과 실제 고양이 사진을 임의로 입력받으며 둘을 Fake/Real로 구분하는 <strong>이진 분류</strong>를 수행
학습을 잘 마친 GAN 모델에서 생성자는 실제와 유사한 이미지를 생성하게 되어 판별자가 실제와 가짜를 잘 구분해내지 못한다 <strong>(Accuracy $\approx$ 0.5)</strong>
<img src="https://velog.velcdn.com/images/woojin_22/post/986a65c9-06f8-47fc-8b38-0976e6ef1e98/image.png" alt=""></p>
<ol>
<li>라이브러리 import<br></li>
<li>데이터셋을 불러온 뒤 정규화<br></li>
<li>모델 구축하기 - 생성자
생성자는 Random Noise로부터 이미지를 생성하기 위해 Transpose convolution을 사용하여 Upsampling을 수행
첫 Dense층은 Random Noise를 입력받으며 원하는 이미지 사이즈인 28X28이 나오도록 <strong><code>Conv2DTranspose</code></strong>를 겹겹이 쌓는다
은닉층의 활성화 함수는 ReLU 함수의 변형인 LeakyReLU 함수를 사용하며
활성화 함수 이전에 배치 정규화(Batch Normalization)을 적용<br></li>
<li>모델 구축하기 - 판별자
다음으로 <strong>판별자(Discriminator)</strong>를 구축
합성곱 신경망(Convolutional Neural Network, CNN) 기반의 이미지 분류기이며
은닉층의 활성화 함수는 ReLU 함수의 변형인 LeakyReLU 함수를 사용하고 Dropout을 적용<br></li>
<li>손실 함수와 옵티마이저 정의
생성자와 판별자의 손실 함수를 정의한다
판별자의 손실함수는 <strong><code>real_loss</code></strong>와 <strong><code>fake_loss</code></strong>를 더한 값</li>
</ol>
<p><strong><code>real_loss</code></strong>의 경우 전체가 1인 행렬과 <strong><code>real_ouput</code></strong>을 비교하여 구하며
<strong><code>fakse_loss</code></strong>의 경우 전체가 0인 행렬과 <strong><code>fakse_output</code></strong>을 비교하여 구한다
생성자의 손실 함수는 전체가 1인 행렬과 <strong><code>fakse_output</code></strong>을 비교하여 구한다
6. 모델이 저장되는 <strong>Checkpoint</strong>를 설정</p>
<ol start="7">
<li><p>훈련 루프를 지정
1 생성자가 입력으로 Random Noise를 입력받는다
2 입력받은 Random Noise를 사용하여 이미지 생성
3 판별자를 사용하여 Train데이터셋의 진짜 이미지와 생성자가 만들어낸 가짜 이미지를 분류
4 각 모델의 손실을 계산하고, 경사 하강법과 역전파를 통해 가중치를 업데이트</p>
</li>
<li><p>함수를 실행시켜 실제 훈련을 진행</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N332] 분할과 객체탐지/인식]]></title>
            <link>https://velog.io/@woojin_22/N332-%EB%B6%84%ED%95%A0%EA%B3%BC-%EA%B0%9D%EC%B2%B4%ED%83%90%EC%A7%80%EC%9D%B8%EC%8B%9D</link>
            <guid>https://velog.io/@woojin_22/N332-%EB%B6%84%ED%95%A0%EA%B3%BC-%EA%B0%9D%EC%B2%B4%ED%83%90%EC%A7%80%EC%9D%B8%EC%8B%9D</guid>
            <pubDate>Wed, 03 May 2023 05:45:55 GMT</pubDate>
            <description><![CDATA[<h2 id="분할segmentation">분할(Segmentation)</h2>
<p>아래 이미지와 같이 하나의 이미지에서 같은 의미를 가지고 있는 부분을 구분해내는 Task
<img src="https://velog.velcdn.com/images/woojin_22/post/f1150c48-01b2-467a-9faf-0a3e52adc815/image.png" alt="">
동일한 의미(사람, 자동차, 도로, 인도, 자연물 등)마다 해당되는 픽셀이 모두 레이블링 되어있는 데이터셋을 <strong>픽셀 단위에서 레이블을 예측</strong>한다</p>
<h3 id="semantic-segmentation-vs-semantic-instance-segmentation">Semantic Segmentation vs (Semantic) Instance Segmentation</h3>
<p>의미적(Semantic)으로 &#39;사람&#39;으로 분류되는 개체에 대해서는 모두 동일하게 라벨링을 해줌
이러한 구분 방식을 의미적 분할(Semantic Segmentation)이라고 함</p>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/e0fc65ac-b7fc-468d-becb-283d31d764ab/image.png" alt=""> 이렇게 개체까지 구분하는 방식을 Instance Segmentation 이라고 함<br></p>
<p>두 방법을 아래와 같이 구분한다
<img src="https://velog.velcdn.com/images/woojin_22/post/9106f17c-a3c4-4ddb-99f7-2476544883d9/image.png" alt=""></p>
<h3 id="대표적인-segmentation-model">대표적인 Segmentation Model</h3>
<p>이미지 분할(Segmentation)을 위한 대표적인 모델 --&gt; FCN, U-net</p>
<h3 id="fcnfully-convolutional-networks">FCN(Fully Convolutional Networks)</h3>
<p>CNN의 분류기 부분, 즉 완전 연결 신경망(FUlly Connected layer)부분을 합겅곱 층(Convolutional Layer)으로 대체한 모델
FCN에서는 CNN에서 사용하였던 완전 연결 신경망의 위치정보를 무시한다는 단점을 <strong>합성곱 층으로 모두 대체함</strong>으로써 해결함
<img src="https://velog.velcdn.com/images/woojin_22/post/b2bd3978-e605-41a6-8115-e5e7e0984640/image.png" alt="">
갑자기 이미지의 크기가 커지는 부분은 
Segmetntatio은 픽셀별로 분류를 진행하기 때문에 원래 이미지와 비슷하게 크기를 키워주는 Upsampling을 해주어야 한다</p>
<ul>
<li>Upsampling
CNN에서 사용되는 것처럼 Convolution과 Pooling을 사용하여 이미지의 특징을 추출하는 과정을 Downsampling(다운샘플링)이라고 함 반대로 이미지의 크기로 키우는 과정은 Upsampling(업샘플링)
Upsampling에는 기존 Convolution 과는 다른 Transpose Convolution이 적용됨</li>
<li><em>Transpose Convolution*</em> 에서는 각 픽셀에 커널을 곱한 값에 Stride를 주어 나타냄으로써 이미지 크기를 키워나감
<img src="https://velog.velcdn.com/images/woojin_22/post/4f23f09c-d383-4e9f-bf2d-260ce5f0cf6a/image.gif" alt="">
2X2 이미지가 입력되었을 때 3X3 필터에 의해 Transpose convolution되는 과정</li>
</ul>
<h4 id="u-net">U-net</h4>
<p>Segmentation을 위한 대표적 모델 중 하나
<img src="https://velog.velcdn.com/images/woojin_22/post/95e25ef1-7ef3-427d-8b45-5a0f8cbcc3a6/image.png" alt="">
Downsampling과 Upsampling 두 부분으로 나눌 수 있다
Downsampling에서는 Convolution과 Maxpooling을 거치며 이미지의 특징을 추출
Upsampling에서는 Convolution과 Transpose Convolution을 거치며 원본 이미지와 비슷한 크기로 복원
Downsampling 출력으로 나왔던 Feature map을 적당한 크기로 잘라서 붙여준 뒤 추가 데이터로 사용</p>
<h3 id="example">Example</h3>
<ol>
<li>필요한 패키지 다운로드 후 import</li>
<li>Dataset을 다운로드</li>
<li>전처리 함수를 정의
이미지와 정규화 하는 함수를 정의하고 훈련 및 시험 데이터셋을 불러오는 전처리 함수 정의</li>
<li>데이터셋에 전처리 함수를 적용</li>
<li>특정 이미지를 불러와서 Segmentation이 잘 되었을 때 픽셀의 클래스가 어떻게 분류될지 확인</li>
<li>모델 정의</li>
<li>모델의 예측을 보여주는 함수와 학습 중에 해당 함수를 동작할 수 있도록 Callback을 정의</li>
<li>모델 학습</li>
<li>학습 완료 후 시험 데이터셋 내 특정 이미지에 대한 예측 결과 시각화</li>
</ol>
<h2 id="객체-탐지인식object-detectionrecognition">객체 탐지/인식(Object Detection/Recognition)</h2>
<p>객체 탐지/인식은 전체 이미지에서 레이블에 맞는 객체를 찾아내는 Task
자율주행을 위한 주요 인공지능 기술로 사용
<img src="https://velog.velcdn.com/images/woojin_22/post/7cc1eb96-7a2c-49dc-8fe7-207607661b7a/image.png" alt="">
Bounding Box라고 하는 사각형 박스를 만든 후, 박스 내의 객체가 속하는 클래스가 무엇인지 분류</p>
<h3 id="iouintersection-over-union">IoU(Intersection over Union)</h3>
<p>객체 탐지를 평가하는 지표
초록색 박스처럼 정답에 해당하는 Bounding Box를 Ground-truth라고 함
<img src="https://velog.velcdn.com/images/woojin_22/post/eb376504-48c0-40ef-abe4-1a8ae4d55eb4/image.png" alt="">
모델이 빨간색 박스처럼 예측했을 때 IoU는 다음 식을 사용하여 구할 수 있다
<img src="https://velog.velcdn.com/images/woojin_22/post/f3acffae-b32d-4f5e-a85d-86d560a2e3c7/image.png" alt="">
IoU를 사용하면 객체가 포함되어 있지만 너무 큰 범위를 잡는 문제를 해결할 수 있다<br>
Ground-truth/Prediction에 해당하는 Bounding Box에 따라 IoU가 구해지는 예시
<img src="https://velog.velcdn.com/images/woojin_22/post/565e669c-c8af-45a2-9c63-a9033c896b0f/image.png" alt=""></p>
<h3 id="대표적인-개체-탐지-model">대표적인 개체 탐지 Model</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/3a636ef0-fcff-4923-b065-447c0d41e580/image.png" alt="">
어떤 단계를 거쳐 분류가 진행되는지에 따라 2-stage방식과 1-stage방식으로 나눔</p>
<h4 id="two-stage-detector">Two Stage Detector</h4>
<p>Two Stage Detector는 일련의 알고리즘을 통해 객체가 있을만한 곳을 추천받은(Region Proposal) 뒤에 추천받은 Region, 즉 RoI(Region of Interest)에 대해 분류를 수행하는 방식
<img src="https://velog.velcdn.com/images/woojin_22/post/d67e52e9-d153-4c3d-b0c0-de46971b7670/image.png" alt="">
R-CNN계열(R-CNN, Fast R-CNN, Faster R-CNN 등)의 모델이 있다</p>
<h4 id="one-stage-detector">One Stage Detector</h4>
<p>One Stage Detector는 특정 지역을 추천받지 않고 입력 이미지를 Grid 등의 같은 작은 공간으로 나눈 뒤 해당 공간을 탐색하며 분류를 수행하는 방식
<img src="https://velog.velcdn.com/images/woojin_22/post/102aefcd-9a84-467a-bbe8-64a4870d13cb/image.png" alt="">
 모델로는 SSD(Single Shot multibox Detector)계열과 YOLO(You Only Look Once)계열의 모델이 있다</p>
<h4 id="yolo모델">YOLO모델</h4>
<p> 13 x 13 / 26 x 26 / 52 x 52 (세밀한 Detrection 가능) 3가지의 Feature Map을 동시에 얻을 수 있기 때문에 속도가 굉장히 빠르다 인식속도는 초당 120프레임</p>
<hr>
<p> R-CNN과 YOLO 레퍼런스 : <a href="https://hackmd.io/PREEDxG4QDqDlRyVQ5rG1A">https://hackmd.io/PREEDxG4QDqDlRyVQ5rG1A</a>
 YOLO모델 코드 레퍼런스 : <a href="https://colab.research.google.com/drive/1x2-2frS8kIO5hk2jUcQIWzGfzgOZn4uX?usp=share_link">https://colab.research.google.com/drive/1x2-2frS8kIO5hk2jUcQIWzGfzgOZn4uX?usp=share_link</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N324] 트랜스포머]]></title>
            <link>https://velog.io/@woojin_22/N324-%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%EB%A8%B8</link>
            <guid>https://velog.io/@woojin_22/N324-%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%EB%A8%B8</guid>
            <pubDate>Fri, 28 Apr 2023 07:30:27 GMT</pubDate>
            <description><![CDATA[<h2 id="transformer--attention-is-all-you-need">Transformer : Attention is All You Need</h2>
<h3 id="트랜스포머transformer란">트랜스포머(Transformer)란?</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/4ceece4a-7b73-4061-969f-3e34ffc7c07a/image.png" alt="">
기계 번역을 위한 새로운 모델
Attention 메커니즘을 극대화하여 뛰어난 번역 성능 기록
자연어처리 모델의 기본 아이디어는 거의 모두 트랜스포머를 기반으로 함
자연어처리가 아닌 다른 문제도 잘 풀고있기 때문에 최근 CV에도 적용하려는 시도가 있음</p>
<p>RNN기반 모델의 단점은 단어가 순차적으로 들어온다는 점
트랜스포머는 이런 문제를 해결하기 위해 등장한 모델
모든 토큰을 동시에 입력받아 병렬 처리하기 때문에 GPU 연산에 최적화</p>
<ul>
<li>트랜스포머의 구조
<img src="https://velog.velcdn.com/images/woojin_22/post/c8821ed6-546d-4122-b06c-382f20b4b601/image.png" alt="">
트랜스포머는 인코더 블록과 디코더 블록이 6개씩 모여있는 구조</li>
</ul>
<p>트랜스포머에서는 병렬화를 위해 모든 단어 벡터를 동시에 입력받음
컴퓨터가 단어의 위치를 알 수 있도록 위치 정보를 담은 벡터를 따로 제공해주어야 함
단어의 상대적인 위치 정보를 담은 벡터를 만드는 과정을 Positional Encoding 이라고 함</p>
<h3 id="셀프-어텐션self-attention">셀프-어텐션(Self-Attention)</h3>
<p>트랜스포머의 주요 매커니즘
<img src="https://velog.velcdn.com/images/woojin_22/post/0864ef34-39e5-46f6-ab34-75e7da02d633/image.png" alt=""></p>
<blockquote>
<p><em>The animal didn&#39;t cross the street because it was too tired</em></p>
</blockquote>
<p>다음과 같은문장이 있을때 문장을 제대로 번역하려면 &quot;it&quot;과 같은 지시대명사가 어떤 대상을 가리키는지 알아야 함
<img src="https://velog.velcdn.com/images/woojin_22/post/d5e38a41-63e4-4c00-b651-f49f62e3e412/image.png" alt=""></p>
<p>트랜스포머에서는 번역하려는 문장 내부 요소의 관계를 잘 파악하기 위해서 문장 자신에 대해 어텐션 매커니즘을 적용함
이를 Self-Attention 이라고 함</p>
<p>셀프-어텐션은 세가지 가중치 벡터를 대상으로 어텐션을 적용함</p>
<ol>
<li>특정 단어의 쿼리 벡터와 모든 단어의 키 벡터를 내적. 내적을 통해 나오는 값이 Attention 스코어</li>
<li>계산값을 안정적으로 만들어주기 위한 계산 보정</li>
<li>Softmax를 취함. 쿼리에 해당하는 단어와 문장 내 다른 단어가 가지는 관계의 비율을 구할 수 있다</li>
<li>밸류 각 단어의 벡터를 곱해준 후 모두 더하면 Self-Attention 과정 끝</li>
</ol>
<pre><code>def scaled_dot_product_attention(q, k, v, mask):
    &quot;&quot;&quot;
    Attention 가중치를 구하는 함수입니다.
    q, k, v 의 leading dimension은 동일해야 합니다.
    k, v의 penultimate dimension이 동일해야 합니다, i.e.: seq_len_k = seq_len_v.

    Mask는 타입(padding or look ahead)에 따라 다른 차원을 가질 수 있습니다.
    덧셈시에는 브로드캐스팅 될 수 있어야합니다.

    Args:
        q: query shape == (..., seq_len_q, depth)
        k: key shape == (..., seq_len_k, depth)
        v: value shape == (..., seq_len_v, depth_v)
        mask: Float tensor with shape broadcastable 
            to (..., seq_len_q, seq_len_k). Defaults to None.

    Returns:
        output, attention_weights
    &quot;&quot;&quot;

    matmul_qk = tf.matmul(q, k, transpose_b=True)  # (..., seq_len_q, seq_len_k)

    # matmul_qk(쿼리와 키의 내적)을 dk의 제곱근으로 scaling 합니다.
    dk = tf.cast(tf.shape(k)[-1], tf.float32)
    scaled_attention_logits = matmul_qk / tf.math.sqrt(dk)

    # 마스킹을 진행합니다.
    if mask is not None:
        scaled_attention_logits += (mask * -1e9)  

    # 소프트맥스(softmax) 함수를 통해서 attention weight 를 구해봅시다.
    attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1)  # (..., seq_len_q, seq_len_k)

    output = tf.matmul(attention_weights, v)  # (..., seq_len_q, depth_v)

    return output, attention_weights</code></pre><h3 id="multi-head-attention">Multi-Head Attention</h3>
<p>멀티헤드 어텐션을 적용하면 여러 개의 Attention 매커니즘을 동시에 병렬적으로 실행
각 Head마다 다른 Attention 결과를 내어주기 대문에 앙상블과 유사한 효과, 병렬화 효과 극대화</p>
<h3 id="layer-normalization--skip-connection">Layer Normalization &amp; Skip connection</h3>
<p>트랜스포머의 모든 sub-layer에서 출력된 벡터는 <strong>Layer Nnormalization</strong>과 <strong>Skip connection</strong>을 거치게 된다
Skip connection은 역전파 과정에서 정보가 소실되지 않도록 한다
<img src="https://velog.velcdn.com/images/woojin_22/post/03ac6d7f-5da7-425b-9a2b-f544d01c9c17/image.png" alt=""></p>
<h3 id="feed-forward-neural-networkffnn">Feed Forward Neural Network(FFNN)</h3>
<p>은닉층의 차원이 늘어났다가 다시 원래 차원으로 줄어드는 단순한 2층 신경망
활서와 함수로 ReLU를 사용
<img src="https://velog.velcdn.com/images/woojin_22/post/b86e0efa-93de-4140-8646-2894917f829d/image.png" alt=""></p>
<h3 id="masked-self-attention">Masked Self-Attention</h3>
<p>디코더 블록에서 사용하기 위해 마스킹 과정이 포함된 Self-Attention
해당 위치 타깃 단어 뒤에 위치한 단어는 Self-Attention에 영향을 주지 않도록 마스킹을 해주게 됨</p>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/e6b9f918-e80c-414b-bbea-8e8412dacc27/image.png" alt=""></p>
<h3 id="encoder-decoder-attention">Encoder-Decoder Attention</h3>
<p>디코더에서 Masked Self-Attention 층을 지난 벡터는 Encoder-Decoder Attention층으로 들어감
좋은 번역을 위해서는 번역할 문장과 번역된 문장간의 관계 중요
번역할 문장과 번역되는 문장의 정보 관계를 엮어주는 부분
<img src="https://velog.velcdn.com/images/woojin_22/post/0acba323-5436-46e7-82cb-585a061de7c0/image.png" alt=""></p>
<h3 id="linear--softmax-layer">Linear &amp; Softmax Layer</h3>
<p>디코더의 최상층을 통과한 벡터들은 Linear 층을 지난 후 Softmax 를 통해 예측할 단어의 확률을 구함
<img src="https://velog.velcdn.com/images/woojin_22/post/18bad5c6-ba36-4f46-9a95-da12a130551d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N323] 언어모델과 순환 신경망(RNN)]]></title>
            <link>https://velog.io/@woojin_22/N323-%EC%96%B8%EC%96%B4%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9DRNN</link>
            <guid>https://velog.io/@woojin_22/N323-%EC%96%B8%EC%96%B4%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9DRNN</guid>
            <pubDate>Thu, 27 Apr 2023 08:45:45 GMT</pubDate>
            <description><![CDATA[<h2 id="1-언어-모델language-model">1. 언어 모델(Language Model)</h2>
<p>문장과 같은 단어 시퀀스에서 각 단어의 확률을 계산하는 모델
ex) <strong>&#39;Word2Vec&#39;</strong></p>
<p>$l$개의 단어로 구성된 문장은 아래와 같이 나타낼 수 있다</p>
<blockquote>
<p>$w_1, w_2, w_3, ..., w_l$</p>
</blockquote>
<p><code>CBoW</code>가 타겟 단어(target word)를 예측할 확률</p>
<blockquote>
<p>$P(w_t \vert w_{t-2},w_{t-1},w_{t+1},w_{t+2})$</p>
</blockquote>
<h3 id="통계적-언어-모델statistical-language-model-slm">통계적 언어 모델(Statistical Language Model, SLM)</h3>
<p>신경망 언어 모델이 주목받기 전부터 연구되어 온 전통적인 접근 방식</p>
<ul>
<li>통계적 언어 모델의 확률 계산
단어의 등장 횟수를 바탕으로 조건부 확률을 계산한다<blockquote>
<p>$P(\text{&quot;I&quot;,&quot;am&quot;,&quot;a&quot;,&quot;student&quot;}) = P(\text{&quot;I&quot;}) \times P(\text{&quot;am&quot;} \vert \text{&quot;I&quot;}) \times P(\text{&quot;a&quot;} \vert \text{&quot;I&quot;,&quot;am&quot;}) \times P(\text{&quot;student&quot;} \vert \text{&quot;I&quot;,&quot;am&quot;,&quot;a&quot;})$</p>
</blockquote>
</li>
</ul>
<p>전체 말뭉치의 문장 중에서 시작할 때 <em>&quot;I&quot;</em> 로 시작하는 문장의 횟수를 구함. 전체 말뭉치의 문장이 1000개이고, 그 중 <em>&quot;I&quot;</em> 로 시작하는 문장이 100개라면</p>
<blockquote>
<p>$$P(\text{&quot;I&quot;}) = \frac{100}{1000} = \frac{1}{10}$$</p>
</blockquote>
<p>다음으로, <em>&quot;I&quot;</em> 로 시작하는 100개의 문장 중 바로 다음에 <em>&quot;am&quot;</em> 이 등장하는 문장이 50개라면 </p>
<blockquote>
<p>$$P(\text{&quot;am&quot;} \vert \text{&quot;I&quot;}) = \frac{50}{100} = \frac{1}{2}$$</p>
</blockquote>
<p>모든 조건부 확률을 구한 뒤 서로를 곱해주면 문장이 등장할 확률 $P(\text{&quot;I&quot;,&quot;am&quot;,&quot;a&quot;,&quot;student&quot;})$ 을 구할 수 있다</p>
<ul>
<li>통계적 언어 모델의 한계점
희소성(sparsity)문제를 가지고 있다.
개선하기 위해 N-gram이나 스무딩(smoothing), 백오프(boack-off) 같은 방법이 고안됨</li>
</ul>
<h3 id="신경망-언어-모델neural-langauge-model">신경망 언어 모델(Neural Langauge Model)</h3>
<p>횟수 기반 대신 <code>Word2Vec</code> 이나 <code>fastText</code> 등의 출력값인 임베딩 벡터를 사용한다
말뭉치에 등장하지 않더라도 의미적, 문법적으로 유사한 단어라면 선택될 수 있다</p>
<h2 id="2-순환-신경망recurrent-neural-network-rnn">2. 순환 신경망(Recurrent Neural Network, RNN)</h2>
<h3 id="연속형-데이터sequential-data">연속형 데이터(Sequential Data)</h3>
<p>어떤 순서로 오느냐에 따라서 단위의 의미가 달라지는 데이터</p>
<h3 id="rnn의-구조">RNN의 구조</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/90d7d3ef-0681-4764-ab00-c2d6b97d649c/image.png" alt="">
등호 왼쪽</p>
<ol>
<li>입력 벡터가 은닉층에 들어가는 화살표</li>
<li>은닉층으로부터 출력 벡터가 생성되는 화살표</li>
<li>은닉층에서 나와 다시 은닉층으로 입력되는 화살표
3번 화살표는 특정 시점에서의 은닉 벡터가 다음 시점의 입력 벡터로 다시 들어가는 과정
출력 벡터가 다시 입력되는 특성 때문에 &#39;순환 신경망&#39;</li>
</ol>
<h3 id="rnn의-장점과-단점">RNN의 장점과 단점</h3>
<ul>
<li>RNN의 장점
모델이 간단하고 어떤 길이의 sequential 데이터라도 처리할 수 있음</li>
<li>RNN의 단점 1 : 병렬화 불가능
벡터가 순차적으로 입력됨 GPU 연산을 하였을 때 이점이 없다</li>
<li>RNN의 단점 2 : 기울기 폭발, 기울기 소실</li>
</ul>
<h2 id="3-lstm--gru">3. LSTM &amp; GRU</h2>
<h3 id="장단기기억망long-term-short-memory-lstm">장단기기억망(Long Term Short Memory, LSTM)</h3>
<p>RNN에 기울기 정보 크기를 조절하기 위한 Gate를 추가한 모델
대부분 RNN보다 LSTM사용</p>
<ul>
<li><strong>LSTM의 구조</strong>
<img src="https://velog.velcdn.com/images/woojin_22/post/b644eec1-f430-47e8-ba8f-095ea6f7164d/image.png" alt=""></li>
</ul>
<p>기울기 소실문제를 해결하기 위해 등장</p>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/f16bdcd8-f24e-48c3-8528-dc136ded0aaa/image.gif" alt=""></p>
<h3 id="grugated-recurrent-unit">GRU(Gated Recurrent Unit)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/107c1851-ed5f-4422-943b-278cc5cfbbd0/image.png" alt=""></p>
<ul>
<li><strong>GRU 셀의 특징</strong></li>
</ul>
<ol>
<li>LSTM에 있었던 cell-state가 사라짐</li>
<li>하나의 Gate가 forget, input gate를 모두 제어한다</li>
<li>GRU 셀에서는 output 게이트가 없다</li>
</ol>
<h2 id="4-rnn구조에-attention-적용하기">4. RNN구조에 Attention 적용하기</h2>
<p>RNN의 가장 큰 단점 중 하나는 기울기소실로부터 나타나는 장기 의존성(Long-term dependency)문제
장기 의존성 문제 : 문장이 길어질 경우 앞 단어의 정보를 잃어버리게 되는 현상
아무리 LSTM, GRU가 장기 의존성 문제를 개선했다하더라도 문장이 매우 길어지면(30-50단어) 모든 단어 정보를 고정 길이의 hidden-state 벡터에 담기 어려움
해결방법 : Attention(어텐션)
<img src="https://velog.velcdn.com/images/woojin_22/post/15d85a39-dac3-4973-a6f1-d34713d2c54e/image.gif" alt="">
Attention은 각 인코더의 Time-tep 마다 생성되는 hidden-state 벡터를 간직한다
입력 단어가 N개라면 N개의 hidden-state 벡터를 모두 간직한다
모든 단어가 입력되면 생성된 hidden-state 벡터를 모두 디코더에 넘겨준다</p>
<h3 id="디코더에서-attention이-동작하는-방법">디코더에서 Attention이 동작하는 방법</h3>
<p>디코더의 각 time-step 마다의 hidden-state 벡터는 쿼리로 작용한다
인코더에서 넘어온 N개의 hidden-state 벡터를 키(key)로 여기고 이들과의 연관성을 계산
이 때 계산은 내적(dot-product)을 사용하고 내적의 결과를 Attention 가중치로 사용한다</p>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/fcefb243-a875-4c9c-ae5f-87e7ce907fbb/image.png" alt=""></p>
<blockquote>
<ol>
<li>쿼리(Query)인 디코더의 hidden-state 벡터, 키(Key)인 인코더에서 넘어온 hidden-state 벡터를 준비합니다.</li>
<li>각각의 벡터를 내적한 값을 구합니다.</li>
<li>이 값에 소프트맥스(softmax) 함수를 취해줍니다.</li>
<li>소프트맥스를 취하여 나온 값에 밸류(Value)에 해당하는 인코더에서 넘어온 hidden-state 벡터를 곱해줍니다. </li>
<li>이 벡터를 모두 더해줍니다. 이 벡터의 성분 중에는 쿼리-키 연관성이 높은 밸류 벡터의 성분이 더 많이 들어있게 됩니다.</li>
<li>(그림에는 나와있지 않지만) 최종적으로 5에서 생성된 벡터와 디코더의 hidden-state 벡터를 사용하여 출력 단어를 결정하게 됩니다.
<img src="https://velog.velcdn.com/images/woojin_22/post/09ba237e-6615-4860-86d6-378d77a78f88/image.gif" alt=""></li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N322] 단어의 분산 표현]]></title>
            <link>https://velog.io/@woojin_22/N312-%EB%8B%A8%EC%96%B4%EC%9D%98-%EB%B6%84%EC%82%B0-%ED%91%9C%ED%98%84</link>
            <guid>https://velog.io/@woojin_22/N312-%EB%8B%A8%EC%96%B4%EC%9D%98-%EB%B6%84%EC%82%B0-%ED%91%9C%ED%98%84</guid>
            <pubDate>Wed, 26 Apr 2023 08:02:21 GMT</pubDate>
            <description><![CDATA[<h1 id="1-벡터화">1. 벡터화</h1>
<h3 id="1-원-핫-인코딩one-hot-encoding">1) 원-핫 인코딩(One-hot Encoding)</h3>
<p>범주형 변수(Categorical fatture)를 벡터로 나타나는 방법</p>
<blockquote>
<p>&quot;I am a student&quot;</p>
</blockquote>
<p>라는 문장에서 각 단어를 원-핫 인코딩으로 나타내면</p>
<blockquote>
<p>I : [1 0 0 0]
am : [0 1 0 0]
a : [0 0 1 0]
student : [0 0 0 1]</p>
</blockquote>
<p><strong>원-핫 인코딩의 치명적 단점 : 단어 간 유사도 구할 수 없다</strong>
원-핫 인코딩을 적용한 서로 다른 두 벡터의 내적은 항상 0이므로, 어떤 두 단어를 골라 코사인 유사도를 구하더라도 그 값은 0이 된다
따라서 코사인 유사도(cosine similarity)를 사용한다</p>
<p>$$
\large \text{Cosine similarity} = \frac{\vec{a} \cdot \vec{b} }{\vert \vec{a} \vert \vert \vec{b} \vert }
$$</p>
<h3 id="2-임베딩">2) 임베딩</h3>
<p>단어를 고정 길이의 벡터, 즉 차원이 일정한 벡터로 나타내기 때문
임베딩을 거친 단어 벡터는 원-핫 인코딩과는 다른 형태의 값을 가진다
ex)</p>
<blockquote>
<p>[0.04227, -0.0033, 0.1607, -0.0236, ...]</p>
</blockquote>
<h1 id="2-word2vec">2. Word2Vec</h1>
<p>Word to Vector, 단어를 벡터로 나타내는 방법, 가장 널리 사용되는 임베딩 방법 중 하나</p>
<h3 id="1-cbow-와-skip-gram">1) CBow 와 Skip-gram</h3>
<p><code>Cbow</code>와 &#39;Skip-gram&#39;의 차이</p>
<ol>
<li>주변 단어에 대한 정보를 기반으로 중심 단어의 정보를 예측하는 모델 ▶️ CBow(Continuous Bag-of-Words)</li>
<li>중심 단어의 정보를 기반으로 주변 단어의 정보를 예측하는 모델 ▶️  Skip-gram
<img src="https://velog.velcdn.com/images/woojin_22/post/12c8d386-74ca-48be-a693-4d59f1b79ae1/image.png" alt=""></li>
</ol>
<p>역전파 관점에서 보면 Skip-gram에서 훨씬 더 많은 학습이 일어나기 때문에 Skip-gram의 성능이 조금 더 좋게 나타난다
물론 계산량이 많기 때문에 Skip-gram에 드는 리소스가 더 크다</p>
<h3 id="2-word2vec-모델의-구조">2) Word2Vec 모델의 구조</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/8848e220-cc4d-4666-9945-70db2dc8e1db/image.png" alt=""></p>
<p>성능 = Skip-gram &gt; CBow</p>
<ul>
<li>입력 : Word2Vec의 입력은 원-핫 인코딩된 단어 벡터</li>
<li>은닉층 : 임베딩 벡터의 차원수 만큼의 노드로 굿어된 은닉층이 1개인 신경망</li>
<li>출력층 : 단어 개수 만큼의 노드로 이루어져 있으며 활성화 함수로 소프트맥스 사용<h3 id="3-word2vec-학습을-위한-학습-데이터-디자인">3) Word2Vec 학습을 위한 학습 데이터 디자인</h3>
효율적으로 학습하기위해 디자인을 해야한다</li>
</ul>
<p>예를 들어, <strong>&quot;The tortoise jumped into the lake&quot;</strong> 라는 문장에 대해 단어쌍을 구성하면
윈도우 크기가 2인 경우 다음과 같이 Skip-gram을 학습하기 위한 데이터 쌍을 구축할 수 있다</p>
<ul>
<li>중심 단어 : <strong>The</strong>, 주변 문맥 단어 : tortoise, jumped<ul>
<li>학습 샘플: (the, tortoise), (the, jumped)</li>
</ul>
</li>
<li>중심 단어 : <strong>tortoise</strong>, 주변 문맥 단어 : the, jumped, into<ul>
<li>학습 샘플: (tortoise, the), (tortoise, jumped), (tortoise, into)</li>
</ul>
</li>
<li>중심 단어 : <strong>jumped</strong>, 주변 문맥 단어 : the, tortoise, into, the<ul>
<li>학습 샘플: (jumped, the), (jumped, tortoise), (jumped, into), (jumped, the)</li>
</ul>
</li>
<li>중심 단어 : <strong>into</strong>, 주변 문맥 단어 : tortoise, jumped, the, lake<ul>
<li>학습 샘플: (into, tortoise), (into, jumped), (into, the), (into, lake)</li>
</ul>
</li>
</ul>
<h3 id="4-word2vec의-결과">4) Word2Vec의 결과</h3>
<p>학습이 끝나면 임베딩 벡터가 생성된다
만약 임베딩 벡터의 차원을 조절하고 싶다면 은닉층의 노드 수를 줄이거나 늘릴 수 있다
<img src="https://velog.velcdn.com/images/woojin_22/post/cefa5bc2-ecae-4861-a53a-90aa159e4e51/image.png" alt=""></p>
<h3 id="5-word2vec으로-임베딩한-벡터-시각화">5) Word2Vec으로 임베딩한 벡터 시각화</h3>
<p>Word2Vec을 통해 얻은 임베딩 벡터는 단어간의 의미적, 문법적 관계를 잘 나타낸다
<img src="https://velog.velcdn.com/images/woojin_22/post/1306cc74-bb6b-4b04-b6c3-cc4f9949ca66/image.png" alt=""></p>
<ol>
<li><strong><code>man - woman</code></strong> 사이의 관계와 <strong><code>king - queen</code></strong> 사이의 관계가 매우 유사하게 나타난다
생성된 임베딩 벡터가 단어의 <strong>의미적(Semantic) 관계를 잘 표현</strong>하는 것을 확인할 수 있습니다.</br></li>
<li><strong><code>walking - walked</code></strong> 사이의 관계와 <strong><code>swimming - swam</code></strong> 사이의 관계가 매우 유사하게 나타난다
생성된 임베딩 벡터가 단어의 <strong>문법적(혹은 구조적, Syntactic)인 관계도 잘 표현</strong>하는 것을 확인할 수 있습니다.</li>
</ol>
<h3 id="전이-학습transfer-learning">전이 학습(Transfer Learning)</h3>
<p>대량의 데이터로 이미 학습한 사전 학습 모델의 가중치를 가져와 해결하려는 task에 맞게 추가적인 신경망을 만들고 학습하는 것
일반적으로는 가져온 가중치는 동결(학습 시 업데이트 하지 않음)시키기 때문에 모델 자체의 학습 속도가 빠르면서 준수한 성능을 보여줄 수 있다는 장점을 가지고 있다
<img src="https://velog.velcdn.com/images/woojin_22/post/8fba5aaf-c566-4272-b271-c9f8565ee112/image.png" alt=""></p>
<hr>
<p><a href="https://heytech.tistory.com/352">https://heytech.tistory.com/352</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N321] 자연어 처리]]></title>
            <link>https://velog.io/@woojin_22/N321-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@woojin_22/N321-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Tue, 25 Apr 2023 04:40:30 GMT</pubDate>
            <description><![CDATA[<h2 id="자연어-처리-nlpnatural-language-processing">자연어 처리, NLP(Natural Language Processing)</h2>
<h4 id="자연어--사람들이-일상적으로-쓰는-언어를-인공적으로-만들어진-언어인-인공어와-구분하여-부르는-개념">자연어 : 사람들이 일상적으로 쓰는 언어를 인공적으로 만들어진 언어인 인공어와 구분하여 부르는 개념</h4>
<p>인공어의 반대, 자연적으로 발생된 언어
자연어가 아닌 것 : 에스페란토어, 코딩 언어 등
<img src="https://velog.velcdn.com/images/woojin_22/post/81649720-87b8-45a4-aef4-2537be7c9b7b/image.png" alt=""></p>
<h4 id="자연어를-컴퓨터로-처리하는-기술을-자연어-처리라고-함">자연어를 컴퓨터로 처리하는 기술을 자연어 처리라고 함</h4>
</br>

<h3 id="자연어-처리로-할-수-있는-일들">자연어 처리로 할 수 있는 일들</h3>
<pre><code>1. 자연어 이해
    1. 분류 (Positive or Negative)
    2. 추론 (True or False)
    3. 기계 독해 (비문학 문제 풀기)
    4. 품사 태깅
2. 자연어 생성 (텍스트 생성, 뉴스 or 가사)
3. NLU &amp; NLG (이해와 생성)
    1. 기계 번역
    2. 요약
    3. 챗봇
4. 기타
    1. TTS(Text to Speech)
    2. SST(Speech to Text)
    3. Image Captioning : 이미지를 설명하는 문장 생성</code></pre><h2 id="벡터화vectorize">벡터화(Vectorize)</h2>
<p>컴퓨터가 자연어를 이해할 수 있도록 자연어를 처리하는 과정</p>
<pre><code>1. 등장 횟수 기반의 단어 표현 : 단어가 문서(혹은 문장)에 등장하는 횟수를 기반으로 벡터화하는 방법
    - Bog-of-Words(CounterVectorizer)
    - TF-IDF(TfidVectorizer) ⭐⭐⭐
2. 분포 기반의 단어 표현 : 타겟 단어 주변에 있는 단어를 기반으로 벡터화하는 방법</code></pre></br>


<h2 id="텍스트-전처리text-preprocessing">텍스트 전처리(Text Preprocessing)</h2>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/71fd13a3-3030-4866-b74b-fc804d8c0b46/image.png" alt=""></p>
<h3 id="전처리-방법">전처리 방법</h3>
<ul>
<li>대소문자 통일</li>
<li>정규표현식(Regular expression, Regex)</li>
<li>불용어(Stop words) 처리</li>
<li>통계적 트리밍(Trimming)</li>
<li>어간/표제어(Lemmatization) 추출</li>
<li>내장 메서드를 사용한 전처리(lower, replace, ...)</li>
</ul>
<h3 id="전처리-하는-이유">전처리 하는 이유</h3>
<blockquote>
<p>특성의 개수가 선형적으로 늘어날 때 동일한 설명력을 가지기 위해 필요한 인스턴스의 수는 지수적으로 증가한다.
즉 동일한 개수의 인스턴스를 가지는 데이터셋의 차원이 늘어날수록 설명력이 떨어지게 된다.
-&gt; 복잡해서</p>
</blockquote>
<h2 id="정규표현식regex">정규표현식(Regex)</h2>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/919217d7-f338-4973-8d74-abee99ee18ca/image.png" alt="">
구두점이나 특수문자 등 필요없는 문자가 말뭉치 내에 있을 경우 토큰화가 제대로 이루어지지 않는다</p>
<blockquote>
<p>re 라이브러리 사용
[a-z] : 소문자 a-z까지 인식
[A-Z] : 대문자 A-Z까지 인식
[^a-z] : a-z를 제외하고 모두
[가-힣] : 한글 인식</p>
</blockquote>
<ul>
<li>re.sub(정규표현식, 치환할 문자, 치환대상)
  -&gt; &#39;치환 대상&#39;안에 &#39;정규표현식&#39;을 &#39;치환할 문자&#39;로 바꿔주세요
  ex) re.sub(r&#39;[a-z]&#39;, &#39;t&#39;,&#39;amazon&#39;) = &#39;tttttt&#39;</li>
</ul>
<h3 id="spacy-구조">Spacy 구조</h3>
<p>Spacy에서는 기본적으로 doc와 token을 사용한다
doc : token으로 이루어진 문장(문서)
token : 다양한 태그가 되어 있는 데이터</p>
<pre><code>ex) # 기존 text 타입은 string
    # 해당 텍스트가 문자열 인 것만 알 수 있고, 각각 명사인지, 표제어는 무엇인지 등을 알 수는 없다.
    # 토큰화가 되어 있다면?
    # 각 토큰마다 다양한 토큰을 통해 전처리를 할 수 있다.
    # is_alpha, lemma, idx, vector 등등)</code></pre><h4 id="spacy-사용-순서">Spacy 사용 순서</h4>
<p>Pipeline(model) 호출
doc 생성
Token 처리</p>
<pre><code>import spacy
# 1.Pipeline(model) 호출
nlp = spacy.load(&quot;en_core_web_
# 2. doc 생성
doc = nlp(text) # 다수의 텍스트로 이루어진 리스트인 경우 nlp.pipe(texts)
# 3. token 처리
for sentence in doc:
    for token in sentence:
        # 이후에 토큰마다 불용어처리, 표제어 추출 등 진행</code></pre></br>

<h3 id="대소문자-통일-text-preprocessing">대소문자 통일, Text Preprocessing</h3>
<p>Python 내장 메소드 lower() 사용
pandas 형식인 경우 : apply 활용</p>
<blockquote>
<p><code>df[&#39;reviews.text&#39;].apply(lambda x:x.lower</code></p>
</blockquote>
<p>spacy 사용할 경우  token의 Attribute 중 lower_사용</p>
<blockquote>
<p><code>token.lower()</code></p>
</blockquote>
<h3 id="불용어stop-words-처리">불용어(Stop words) 처리</h3>
<p>불용어 set을 생성하여 조건문 사용</p>
<pre><code>if word not in STOP_WORDS:
    token_list.append(word.lower())</code></pre><ol start="2">
<li>Spacy token의 is_stop 사용</li>
</ol>
<pre><code>if token.is_stop == False:
    token_list.append(token.lower_)</code></pre><h3 id="임베딩-count---based-representation">임베딩, Count - Based Representation</h3>
<p>사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체</p>
<ul>
<li>횟수 기반 표현<ul>
<li>TF : 단어들의 빈도만 고려</li>
<li>TF-IDF : TF + 단어가 등장하는 문서 비율 고려</li>
</ul>
</li>
<li>분산 기반 표현<ul>
<li>Word2Vec<ul>
<li>FastText</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N314] 딥러닝 하이퍼파라미터]]></title>
            <link>https://velog.io/@woojin_22/N314-%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%98%EC%9D%B4%ED%8D%BC%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0</link>
            <guid>https://velog.io/@woojin_22/N314-%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%98%EC%9D%B4%ED%8D%BC%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0</guid>
            <pubDate>Fri, 21 Apr 2023 02:50:22 GMT</pubDate>
            <description><![CDATA[<h2 id="교차-검증cross-validation">교차 검증(Cross-Validation)</h2>
<p>Kfold</p>
<pre><code>kf = KFold(n_splits = 5)
skf = StratifiedKFold(n_splits = 5, random_state = 42, shuffle = True)</code></pre><h2 id="파라미터와-하이퍼파라미터의-차이">파라미터와 하이퍼파라미터의 차이</h2>
<p>파라미터 : 학습을 통해 결정되는 값</p>
<p>파라미터는 &quot;가중치&quot;와 &quot;편향&quot;으로 구성되어 있다
(입력층과 은닉층 사이의 파라미터) = (가중치) + (편향) = (입력층 노드 수 x 은닉층 노드 수) + (은닉층 노드 수) = (4 x 8) + 8 = 40</p>
<p>(은닉층과 출력층 사이의 파라미터) = (가중치) + (편향) = (은닉층 노드 수 x 출력층 노드 수) + (출력층 노드 수) = (8 x 3) + 3 = 27</p>
<p>총 학습 파라미터 수 = (입력층과 은닉층 사이의 파라미터) + (은닉층과 출력층 사이의 파라미터)</p>
<p>하이퍼파라미터 : 주로 학습에 직접 관여하며 학습을 통해 결정되지 않는 인자(=직접 결정해주어야 하는 인자)</p>
<h2 id="하이퍼파라미터-튜닝">하이퍼파라미터 튜닝</h2>
<h4 id="매뉴얼-서치-manual-search">매뉴얼 서치, Manual Search</h4>
<p>설정 가능한 하이퍼파라미터를 수작업(Manual)으로 적용하여 튜닝 - 100% 수작업(대학원생 갈아넣기)</p>
<h4 id="그리드-서치-grid-search">그리드 서치, Grid Search</h4>
<p>설정한 범위 내 모든 조합의 경우의 수에 대해 튜닝
탐색할 지점을 정해주게 되면 알아서 모두 수행
오래걸리기 때문에 1개 혹은 2개 정도의 파라미터 최적값을 찾는 용도로 적합</p>
<h4 id="랜덤-서치-randomized-saearch">랜덤 서치, Randomized Saearch</h4>
<p>그리드 서치 단점을 보완하기 위해 나온 방법
설정한 범위 내 무작위의 하이퍼파라미터 조합을 이용해 튜닝
상대적으로 중요한 하이퍼파라미터에 대해 탐색을 더 하고 덜 중요한 하이퍼파라미터에 대해 실험을 덜 하도록 한다</p>
<p>(1 Epoch마다 발생하는 Iteration의 횟수) = (데이터의 수) / (Batch size) = 10000 / 100 = 100
5 Epoch이므로 학습이 종료될 때까지 발생하는 Iteration 횟수 = 5 x 100 = 500</p>
<p>ReLU를 활성화 함수로 사용하므로 He 초기화를 사용하는 것이 유리합니다. He 초기화의 분산은 로 계산할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N313] 더 나은 신경망 - 학습률, 가중치 초기화]]></title>
            <link>https://velog.io/@woojin_22/N313-%ED%95%99%EC%8A%B5%EB%A5%A0</link>
            <guid>https://velog.io/@woojin_22/N313-%ED%95%99%EC%8A%B5%EB%A5%A0</guid>
            <pubDate>Thu, 20 Apr 2023 02:58:21 GMT</pubDate>
            <description><![CDATA[<h3 id="학습률-learning-rate">학습률, Learning Rate</h3>
<p>매 가중치에 대해 구해진 기울기 값을 얼마나 경사 하강법에 적용할 지를 결정하는 하이퍼파라미터
학습률은 처음엔 크게주고 점점 작게주면서 최소를 찾는게 좋다
<img src="https://velog.velcdn.com/images/woojin_22/post/2d9b5da7-9d6c-44e1-9eea-62aafc392515/image.png" alt="">
학습률이 너무 크거나 작으면최적점에 이르기까지 너무 오래 걸리거나 주어진 Iteration 내에서 최적점에 도달하는 데 실패하기도 함
때문에 최적의 학습률을 찾는 것은 학습에서 중요한 요소</p>
<p>해결방법 : 학습률 감소 / 학습률 계획법</p>
<h3 id="1-학습률-감소-learning-rate-decay">1. 학습률 감소, Learning rate Decay</h3>
<p>학습률 감소는 Adagrad, RMSprop, Adam 과 같은 주요 옵티마이저에 이미 구현되어 있기 때문에 쉽게 적용할 수 있다. 해당 옵티마티저의 하이퍼파라미터를 조정하면 감소 정도를 변화시킬 수 있다</p>
<pre><code># optimizer 내 lr(learning rate) 인자를 통해 학습률을 설정할 수 있습니다. beta_1 인자는 학습률 감소율을 설정하며 Adam 내 수식의 변수를 그대로 사용합니다.

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001, beta_1 = 0.89)
             , loss=&#39;sparse_categorical_crossentropy&#39;
             , metrics=[&#39;accuracy&#39;])</code></pre><h3 id="2-학습률-계획법-learning-rate-scheduling">2. 학습률 계획법, Learning rate Scheduling</h3>
<p>Warm-up Step 
<img src="https://velog.velcdn.com/images/woojin_22/post/31041a7c-44f5-475b-aa04-a1772bdcade7/image.png" alt=""></p>
<h3 id="가중치-초기화">가중치 초기화</h3>
<pre><code>1) Xavier 초기화
2) He 초기화</code></pre><p>Sigmoid ⇒ Xavier 초기화
ReLU ⇒ He 초기화</p>
<p>적용하는 방법</p>
<pre><code># 모델 내 추가하는 Dense layer 내 kernel_initializer 인자를 통해 가중치 초기화를 설정할 수 있습니다.

Dense(32, activation=&#39;relu&#39;, kernel_initializer=&#39;he_uniform&#39;)</code></pre><h3 id="머신러닝으로써의-딥러닝">머신러닝으로써의 딥러닝</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/dbde6530-56c5-4e6f-a118-ca794c45b454/image.png" alt="">
딥러닝도 머신러닝 모델이라고 할 수 있기 때문에 과적합에 주의해야함</p>
<h2 id="과적합-방지를-위한-방법들">과적합 방지를 위한 방법들</h2>
<h3 id="1-가중치-감소-weight-decay">1. 가중치 감소, Weight Decay</h3>
<p>과적합은 가중치의 값이 클 때 주로 발생.
가중치 감소에서는 가중치 값이 너무 커지지 않도록 조건을 추가
손실 함수에 가중치와 관련된 항을 추가</p>
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mtable displaystyle="true" columnalign="right left" columnspacing="0em" rowspacing="3pt">
    <mtr>
      <mtd>
        <msub>
          <mi>L</mi>
          <mn>1</mn>
        </msub>
        <mo stretchy="false">(</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mi>w</mi>
        </msub>
        <mo stretchy="false">)</mo>
      </mtd>
      <mtd>
        <mi></mi>
        <mo>=</mo>
        <mfrac>
          <mn>1</mn>
          <mn>2</mn>
        </mfrac>
        <munder>
          <mo data-mjx-texclass="OP">&#x2211;</mo>
          <mi>i</mi>
        </munder>
        <mo stretchy="false">(</mo>
        <mi>o</mi>
        <mi>u</mi>
        <mi>t</mi>
        <mi>p</mi>
        <mi>u</mi>
        <msub>
          <mi>t</mi>
          <mi>i</mi>
        </msub>
        <mo>&#x2212;</mo>
        <mi>t</mi>
        <mi>a</mi>
        <mi>r</mi>
        <mi>g</mi>
        <mi>e</mi>
        <msub>
          <mi>t</mi>
          <mi>i</mi>
        </msub>
        <msup>
          <mo stretchy="false">)</mo>
          <mn>2</mn>
        </msup>
        <mo>+</mo>
        <mstyle mathcolor="blue">
          <mrow data-mjx-texclass="ORD">
            <mi>&#x3BB;</mi>
          </mrow>
          <mo>&#x22C5;</mo>
          <mstyle mathcolor="red">
            <mrow data-mjx-texclass="ORD">
              <mo data-mjx-texclass="ORD" fence="false" stretchy="false">&#x2016;</mo>
              <msub>
                <mi>&#x3B8;</mi>
                <mi>w</mi>
              </msub>
              <msub>
                <mo data-mjx-texclass="ORD" fence="false" stretchy="false">&#x2016;</mo>
                <mn>1</mn>
              </msub>
            </mrow>
          </mstyle>
        </mstyle>
      </mtd>
    </mtr>
    <mtr>
      <mtd>
        <msub>
          <mi>L</mi>
          <mn>2</mn>
        </msub>
        <mo stretchy="false">(</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mi>w</mi>
        </msub>
        <mo stretchy="false">)</mo>
      </mtd>
      <mtd>
        <mi></mi>
        <mo>=</mo>
        <mfrac>
          <mn>1</mn>
          <mn>2</mn>
        </mfrac>
        <munder>
          <mo data-mjx-texclass="OP">&#x2211;</mo>
          <mi>i</mi>
        </munder>
        <mo stretchy="false">(</mo>
        <mi>o</mi>
        <mi>u</mi>
        <mi>t</mi>
        <mi>p</mi>
        <mi>u</mi>
        <msub>
          <mi>t</mi>
          <mi>i</mi>
        </msub>
        <mo>&#x2212;</mo>
        <mi>t</mi>
        <mi>a</mi>
        <mi>r</mi>
        <mi>g</mi>
        <mi>e</mi>
        <msub>
          <mi>t</mi>
          <mi>i</mi>
        </msub>
        <msup>
          <mo stretchy="false">)</mo>
          <mn>2</mn>
        </msup>
        <mo>+</mo>
        <mstyle mathcolor="blue">
          <mrow data-mjx-texclass="ORD">
            <mi>&#x3BB;</mi>
          </mrow>
          <mo>&#x22C5;</mo>
          <mstyle mathcolor="red">
            <mrow data-mjx-texclass="ORD">
              <mo data-mjx-texclass="ORD" fence="false" stretchy="false">&#x2016;</mo>
              <msub>
                <mi>&#x3B8;</mi>
                <mi>w</mi>
              </msub>
              <msub>
                <mo data-mjx-texclass="ORD" fence="false" stretchy="false">&#x2016;</mo>
                <mn>2</mn>
              </msub>
            </mrow>
          </mstyle>
        </mstyle>
      </mtd>
    </mtr>
  </mtable>
</math>
조건을 어떻게 적용할지에 따라 L1 Regularization(LASSO), L2 Regularization(Ridge) 으로 나뉜다

<p>Keras에서 가중치 감소를 적용하고 싶은 층에 regulaizer 파라미터를 추가한다</p>
<pre><code># from tensorflow.keras import regularizers

Dense(64,
      kernel_regularizer=regularizers.l2(0.01),
      activity_regularizer=regularizers.l1(0.01))</code></pre><h3 id="2-드롭-아웃-dropout">2. 드롭 아웃, Dropout</h3>
<p>Iteration 마다 레이어 노드 중 일부를 사용하지 않으면서 학습을 진행하는 방법
<img src="https://velog.velcdn.com/images/woojin_22/post/0e56c987-38d8-4e8e-a043-9076ce373ada/image.png" alt="">
Dropout을 적용할 때 0~1 사이의 실수를 입력한다
Keras 에서는 아래와 같이 Dropout 을 적용하고 싶은 층 다음에 Dropout 함수를 추가하면 됩니다.</p>
<pre><code>
# from tensorflow.keras import regularizers
# from tensorflow.keras.layers import Dropout

Dense(64,
      kernel_regularizer=regularizers.l2(0.01),
      activity_regularizer=regularizers.l1(0.01))
Dropout(0.5) &lt;&lt;&lt; 이 부분
</code></pre><h3 id="3-조기-종료-early-stopping">3. 조기 종료, Early Stopping</h3>
<p>학습 데이터에 대한 손실은 계속 줄어들지만 검증 데이터셋에 대한 손실은 증가한다면 학습을 종료
<img src="https://velog.velcdn.com/images/woojin_22/post/6c364c89-fd07-4a0e-9d9b-eef1e4a8c488/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N312] 역전파, 손실함수]]></title>
            <link>https://velog.io/@woojin_22/N312</link>
            <guid>https://velog.io/@woojin_22/N312</guid>
            <pubDate>Wed, 19 Apr 2023 03:03:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/woojin_22/post/d3f0c1d8-fda7-4b0e-91ad-87b12e5907b0/image.gif" alt=""></p>
<ul>
<li>위 그림에서 설명하고 있는 과정은 다음과 같습니다.</li>
</ul>
<ol>
<li>데이터가 입력되면 신경망 각 층에서 가중치 및 활성화 함수 연산을 반복적으로 수행합니다.</li>
<li>1의 과정을 모든 층에서 반복한 후에 출력층에서 계산된 값을 출력합니다.</li>
<li>손실 함수를 사용하여 예측값(Prediction)과 실제값(Target)의 차이를 계산합니다.</li>
<li>경사하강법과 역전파를 통해서 각 가중치를 갱신합니다.</li>
<li>학습 중지 기준을 만족할 때까지 1-4의 과정을 반복합니다.</li>
</ol>
<h3 id="순전파-forward-propagation">순전파, Forward Propagation</h3>
<p>입력층에서 입력된 신호가 은닉층의 연산을 거쳐 출력층에서 값을 내보내는 과정</p>
<ol>
<li>입력층(혹은 이전 은닉층)으로부터 신호를 전달받음</li>
<li>입력된 데이터에 가중치-편향 연산을 수행</li>
<li>가중합을 통해 구해진 값은 활성화 함수를 통해 다음 층으로 전달</li>
</ol>
<h3 id="손실-함수-loss-function">손실 함수, Loss Function</h3>
<p>예측값과 실제값의 관계를 나타내기 위한 함수
회귀의 손실 함수 : MSE, MAE
이진 분류의 손실 함수 : binary_crossentropy
다중 분류의 손실 함수 : categorical_crossentropy와 sparse_categorical_corssentropy
이 때 연산된 차이를 Loss 혹은 Error라고 함</p>
<h3 id="역전파-back-propagation">역전파, Back Propagation</h3>
<p>반대방향(출력층 &gt; 은닉층 &gt; 입력층)으로 Loss를 전달하며 가중치를 갱신하는 과정
역전파는 경사 하강법(Gradient Descent)을 통해 이루어짐</p>
<h3 id="경사-하강법-gradient-descent">경사 하강법, Gradient Descent</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/0f157d43-6829-4b6a-893d-39d408e7cbf8/image.png" alt=""></p>
<p>경사 하강법은 손실 함수에 미분을 적용한 값(기울기)를 이용해 진행됨</p>
<h3 id="확률적-경사하강법-sgdstochastic-gradient-descent">확률적 경사하강법, SGD(Stochastic Gradient Descent)</h3>
<p>전체 데이터 중 한 개의 데이터에 대한 손실을 이용해 가중치 업데이트</p>
<p>배치 사이즈(batch size) : Gradient를 만들 데이터의 개수
이터레이션(iteration) : 순전파-역전파 과정을 거쳐 가중치 업데이트가 일어나는 횟수, Step
에포크(epoch) : 훈련 데이터셋 전체가 신경망을 통과하는 횟수</p>
<pre><code>model.compile(optimizer=&#39;sgd&#39;,
                loss=&#39;binary_crossentropy&#39;,
                metrics=[&#39;accuracy&#39;])
model.fit(X, y, batch_size=64, epochs=10)


#batch_size=64 는 100정도가 무난하다는 교수님의 의견</code></pre><p>정보) tf의 결과값은 .numpy로 변환하여 print한다</p>
<p>참고 사이트 
<a href="https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/">https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[N311] 퍼셉트론과 활성화함수]]></title>
            <link>https://velog.io/@woojin_22/Section-3-%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@woojin_22/Section-3-%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Tue, 18 Apr 2023 07:03:48 GMT</pubDate>
            <description><![CDATA[<h2 id="스프린트-1">스프린트 1</h2>
<h3 id="활성화-함수">활성화 함수</h3>
<p>계산된 가중합을 얼마 만큼의 신호로 출력할지를 결정</p>
<h3 id="계단-함수step-function">계단 함수(Step Function)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/8bcde165-7a6e-4138-9bf9-d9cba720ec80/image.png" alt="">
가장 간단한 활성화 함수인 계단 함수는 입력값이 임계값(여기서는 0)을 넘기면 1을, 그렇지 않으면 0을 출력하는 함수</p>
<h3 id="시그모이드sigmoid-function">시그모이드(Sigmoid Function)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/9b9171d4-d5f4-4843-9294-1ec519cd3268/image.png" alt=""></p>
<p>가중합 연산값을 0~1 사이의 확률값을 나타내는 함수
어떤 사건이 일어났을 때 결과가 발생한다(1)와 하지 않는다(0)으로 분류</p>
<h3 id="렐루-relurectified-linear-unit">렐루, ReLU(Rectified Linear Unit)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/18dcec66-bcbf-4fe3-891e-f6d088a832c9/image.png" alt=""></p>
<p>기울기 소실 문제를 해결하기 위해 은닉층에서 사용
가중합 연산값이 양수면 값을 그대로 출력하고 0이하면 0을 출력
x &lt; 0 일 때 y = 0</p>
<h3 id="소프트맥스softmax">소프트맥스(Softmax)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/161e6b95-2f0a-4c7a-8e6d-18018222fdb2/image.png" alt=""></p>
<h3 id="다중-분류-문제를-해결하기-위한-활성화-함수">다중 분류 문제를 해결하기 위한 활성화 함수</h3>
<p>가중합 연산값들을 합이 1인 확률 분포 값으로 변환하는 역할
클래스가 최소 3개 이상일 때 사용</p>
<h3 id="활성화-함수의-공통점">활성화 함수의 공통점</h3>
<p>모든 활성화 함수의 공통점은 비선형(Non-linear)이라는 점
층을 아무리 깊게 쌓아도 여러 층을 쌓는 이점을 살리지 못하게 됨
여러 층을 쌓을 때의 장점을 살리기 위해 비선형 함수를 사용하게 된다</p>
<h3 id="논리게이트-logic-gate">논리게이트, Logic Gate</h3>
<p>AND, NAND, OR, XOR
AND = 둘 다 참이면 참
NAND = AND 결과값의 반대
OR = 둘 중 하나라도 참이면 참
XOR = 둘의 값이 다를 때 참, 같다면 거짓</p>
<h3 id="linear-separability">Linear separability</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/27fea051-72df-428f-96e8-4fde4ac598b1/image.png" alt=""></p>
<p>퍼셉트론을 이용해 XOR Gate(배타적 논리합)문제를 해결할 수 없다는 한계가 존재</p>
<h3 id="mlpmultii-layer-perceptron">MLP(Multii-Layer Perceptron)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/d03aed97-737c-4f70-b90c-4ff3b83cab13/image.png" alt=""></p>
<h3 id="인공-신경망-annartificial-neural-network">인공 신경망, ANN(Artificial Neural Network)</h3>
<p><img src="https://velog.velcdn.com/images/woojin_22/post/e3f6eab0-8a6a-4bdc-a931-008062b0df9d/image.png" alt=""></p>
<p>여러 퍼셉트론을 이용해 신경망을 복잡하게 구성할수록 더욱 복잡한 문제를 해결할 수 있음</p>
<h3 id="인공-신경망의-구조">인공 신경망의 구조</h3>
<p>입력층 : 데이터셋을 입력하는 층, 데이터셋의 특성(Feature)의 개수만큼 노드(Node)의 개수
은닉층 : 입력된 데이터를 통해 가중치,편향 연산이 진행되는 층
출력층 : 연산을 마친 최종 결과값을 내보내는 층, 문제에 따라 노드의 개수를 설정</p>
<h3 id="출력층의-노드-수와-활성화-함수">출력층의 노드 수와 활성화 함수</h3>
<p>활성화 함수와 노드의 개수는 층마다 설정할 수 있으며 인공 신경망을 통해 풀고자 하는 문제에 따라 다르게 적용해야 한다
회귀, 이진 분류, 다중 분류</p>
<h3 id="딥러닝이란">딥러닝이란?</h3>
<p>인간이 계산 가능한 수준이라면 딥러닝이라 하지 못한다
컴퓨터가 계산할 정도의 복잡도가 있어야 한다</p>
<pre><code>model = tf.keras.models.sequential()    
model.add(tf.kreas.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(100, activation=&#39;relu&#39;))
model.add(tf.keras.layers.Dense(10, activation=&#39;softmax&#39;))`
</code></pre><pre><code>model.compile(optimizer=&#39;adam&#39;,
loss=&#39;sparse_categorical_crossentropy&#39;,
metrics=[&#39;acuuracy&#39;])

model.fit(X_train, y_train, epochs=5)&#39;</code></pre>]]></description>
        </item>
    </channel>
</rss>