생성적 적대 신경망을 사용하여 랜덤 노이즈에서 데이터 생성

게시 됨: 2022-03-11

GAN(Generative Adversarial Networks)에 대해 알게 된 이후로 나는 그것에 매료되었습니다. GAN은 새로운 데이터를 처음부터 생성할 수 있는 일종의 신경망입니다. 입력으로 약간의 무작위 노이즈를 입력할 수 있으며 침실이나 새 또는 생성하도록 훈련된 모든 것의 사실적인 이미지를 생성할 수 있습니다.

모든 과학자들이 동의할 수 있는 한 가지는 더 많은 데이터가 필요하다는 것입니다.

데이터가 제한된 상황에서 새로운 데이터를 생성하는 데 사용할 수 있는 GAN은 정말 유용할 수 있습니다. 데이터는 때때로 생성하기 어렵고 비용이 많이 들고 시간이 많이 소요될 수 있습니다. 그러나 유용하려면 새로운 데이터는 생성된 데이터에서 얻은 통찰력이 실제 데이터에 여전히 적용될 수 있을 만큼 충분히 현실적이어야 합니다. 고양이에게 쥐를 사냥하도록 훈련시키고 가짜 쥐를 사용한다면 가짜 쥐가 실제로 쥐처럼 보이는지 확인하는 것이 좋습니다.

그것에 대해 생각하는 또 다른 방법은 GAN이 실제 데이터를 만들 수 있도록 데이터에서 구조를 발견한다는 것입니다. 이것은 우리 스스로 그 구조를 볼 수 없거나 다른 방법으로 그것을 꺼낼 수 없는 경우에 유용할 수 있습니다.

생성적 적대 네트워크

이 기사에서는 GAN을 사용하여 새 데이터를 생성하는 방법을 배웁니다. 이 튜토리얼을 현실감 있게 유지하기 위해 Kaggle의 신용 카드 사기 탐지 데이터 세트를 사용합니다.

실험에서 이 데이터 세트를 사용하여 사기 사례를 감지하는 데 도움이 될 만큼 현실적인 데이터를 생성하기 위해 GAN을 얻을 수 있는지 확인하려고 했습니다. 이 데이터 세트는 제한된 데이터 문제를 강조합니다. 285,000건의 거래 중 492건만이 사기입니다. 492건의 사기 사례는 훈련할 대규모 데이터 세트가 아닙니다. 특히 사람들이 몇 배 더 큰 데이터 세트를 갖고 싶어하는 기계 학습 작업의 경우 그렇습니다. 내 실험의 결과는 놀랍지 않았지만 공유하게 되어 기쁘게 생각하는 과정에서 GAN에 대해 많은 것을 배웠습니다.

시작하기 전에

이 GAN 영역에 대해 알아보기 전에 머신 러닝 또는 딥 러닝 기술을 빠르게 익히고 싶다면 다음 두 가지 관련 블로그 게시물을 살펴보세요.

  • 기계 학습 이론 및 응용 소개: 예제가 포함된 시각적 자습서
  • 딥 러닝 튜토리얼: 퍼셉트론에서 딥 네트워크까지

왜 GAN인가?

GAN(Generative Adversarial Networks)은 변형 자동 인코더 또는 제한된 볼츠만 기계와 같은 이전 생성 방법에 비해 인상적인 개선을 보여준 신경망 아키텍처입니다. GAN은 보다 사실적인 이미지(예: DCGAN)를 생성하고, 이미지 간의 스타일 전송을 가능하게 하고(여기 및 여기 참조), 텍스트 설명에서 이미지를 생성하고(StackGAN), 반 지도 학습을 통해 더 작은 데이터 세트에서 학습할 수 있습니다. 이러한 성과로 인해 학계와 상업 분야 모두에서 많은 관심을 불러일으키고 있습니다.

Facebook의 AI 연구 이사인 Yann LeCunn은 심지어 지난 10년 동안 기계 학습에서 가장 흥미로운 발전이라고 말했습니다.

기초

어떻게 배우는지 생각해 보세요. 무언가를 시도하고 피드백을 받습니다. 전략을 조정하고 다시 시도하십시오.

피드백은 비판, 고통 또는 이익의 형태로 올 수 있습니다. 그것은 당신이 얼마나 잘했는지에 대한 자신의 판단에서 올 수 있습니다. 종종 가장 유용한 피드백은 다른 사람의 피드백입니다. 왜냐하면 그것은 숫자나 감각이 아니라 작업을 얼마나 잘 수행했는지에 대한 지능적인 평가이기 때문입니다.

컴퓨터가 작업을 위해 훈련될 때 인간은 일반적으로 조정된 매개변수 또는 알고리즘의 형태로 피드백을 제공합니다. 이것은 두 숫자를 곱하는 방법을 배우는 것과 같이 작업이 잘 정의되어 있을 때 잘 작동합니다. 컴퓨터가 어떻게 잘못되었는지 쉽고 정확하게 말할 수 있습니다.

개의 이미지를 생성하는 등 복잡한 작업을 수행하면 피드백을 제공하기가 더 어려워집니다. 이미지가 흐릿합니까, 고양이처럼 보입니까, 아니면 전혀 무엇처럼 보입니까? 복잡한 통계를 구현할 수는 있지만 이미지를 실제처럼 보이게 하는 모든 세부 사항을 캡처하기는 어려울 것입니다.

인간은 시각적 입력을 평가한 경험이 많기 때문에 어느 정도 평가할 수 있지만 상대적으로 느리고 평가가 매우 주관적일 수 있습니다. 대신 실제 이미지와 생성된 이미지를 구별하는 작업을 학습하기 위해 신경망을 훈련할 수 있습니다.

그런 다음 이미지 생성기(또한 신경망)와 판별자가 교대로 서로 학습하도록 하여 시간이 지남에 따라 개선할 수 있습니다. 이 게임을 하는 이 두 네트워크는 생성적 적대 네트워크입니다.

GAN의 발명가인 Ian Goodfellow가 이 주제에 대한 술집에서의 논쟁이 어떻게 첫 번째 GAN으로 이어진 열광적인 코딩의 밤으로 이어졌는지에 대해 이야기하는 것을 들을 수 있습니다. 그리고 예, 그는 자신의 논문에서 그 기준을 인정합니다. 이 주제에 대한 Ian Goodfellow의 블로그에서 GAN에 대해 자세히 알아볼 수 있습니다.

GAN의 다이어그램

GAN으로 작업할 때 여러 가지 문제가 있습니다. 단일 신경망 훈련은 아키텍처, 활성화 함수, 최적화 방법, 학습률, 탈락률 등의 선택 항목이 많기 때문에 어려울 수 있습니다.

GAN은 이러한 모든 선택 사항을 두 배로 늘리고 새로운 복잡성을 추가합니다. 제너레이터와 판별자는 훈련 초기에 사용한 트릭을 잊어버릴 수 있습니다. 이로 인해 두 네트워크가 시간이 지남에 따라 개선되지 않는 안정적인 솔루션 주기에 빠질 수 있습니다. 한 네트워크가 다른 네트워크를 압도할 수 있으므로 어느 쪽도 더 이상 학습할 수 없습니다. 또는 생성기가 가능한 솔루션 공간을 많이 탐색하지 않고 현실적인 솔루션을 찾기에 충분할 수 있습니다. 이 마지막 상황을 모드 붕괴라고 합니다.

모드 축소는 생성기가 가능한 현실적인 모드의 작은 하위 집합만 학습하는 경우입니다. 예를 들어 작업이 개의 이미지를 생성하는 것이라면 생성기는 작은 갈색 개의 이미지만 생성하도록 학습할 수 있습니다. 발전기는 다른 크기나 색상의 개로 구성된 다른 모든 모드를 놓쳤을 것입니다.

배치 정규화, 교육 데이터에 레이블 추가 또는 판별자가 생성된 데이터를 판단하는 방식 변경을 포함하여 이를 해결하기 위해 많은 전략이 구현되었습니다.

사람들은 데이터에 레이블을 추가하는 것, 즉 범주로 나누기 위해 거의 항상 GAN의 성능을 향상시킨다는 점에 주목했습니다. 일반적으로 애완 동물의 이미지를 생성하는 방법을 배우는 대신 고양이, 개, 물고기 및 흰 족제비와 같은 이미지를 생성하는 것이 더 쉬워야 합니다.

아마도 GAN 개발에서 가장 중요한 혁신은 판별자가 데이터를 평가하는 방식을 변경한 것이므로 이에 대해 자세히 살펴보겠습니다.

Goodfellow et al.이 2014년에 GAN을 공식화한 경우, 판별자는 주어진 이미지가 실제였거나 생성되었을 확률의 추정치를 생성합니다. 판별자는 실제 이미지와 생성된 이미지로 구성된 이미지 세트를 제공하고 이러한 입력 각각에 대한 추정치를 생성합니다. 판별자 출력과 실제 레이블 간의 오류는 교차 엔트로피 손실로 측정됩니다. 교차 엔트로피 손실은 Jensen-Shannon 거리 측정법과 동일할 수 있으며 2017년 초 Arjovsky et al. 이 메트릭이 어떤 경우에는 실패하고 다른 경우에는 올바른 방향을 가리키지 않는다는 것을 의미합니다. 이 그룹은 Wasserstein 거리 측정법(지구 이동자 또는 EM 거리라고도 함)이 더 많은 경우에 더 잘 작동하고 작동함을 보여주었습니다.

교차 엔트로피 손실은 판별자가 실제 이미지와 생성된 이미지를 얼마나 정확하게 식별했는지를 측정한 것입니다. Wasserstein 메트릭은 대신 실제 및 생성된 이미지에서 각 변수의 분포(즉, 각 픽셀의 각 색상)를 살펴보고 실제 및 생성된 데이터에 대한 분포가 얼마나 멀리 떨어져 있는지를 결정합니다. Wasserstein 메트릭은 질량 곱하기 거리 측면에서 생성된 분포를 실제 분포의 모양으로 밀어넣는 데 얼마나 많은 노력이 필요한지 살펴봅니다. 따라서 대체 이름은 "지구 이동자 거리"입니다. Wasserstein 메트릭은 더 이상 이미지가 실제인지 여부를 평가하지 않고 대신 생성된 이미지가 실제 이미지에서 얼마나 멀리 떨어져 있는지에 대한 비판을 제공하기 때문에 "discriminator" 네트워크를 Wasserstein에서 "비평가" 네트워크라고 합니다. 건축물.

GAN에 대한 좀 더 포괄적인 탐색을 위해 이 기사에서는 네 가지 아키텍처를 살펴보겠습니다.

  • GAN: 원본("바닐라") GAN
  • CGAN: 클래스 레이블을 사용하는 원래 GAN의 조건부 버전
  • WGAN: Wasserstein GAN(그라디언트 페널티 포함)
  • WCGAN: Wasserstein GAN의 조건부 버전

하지만 먼저 데이터 세트를 살펴보겠습니다.

신용 카드 사기 데이터 살펴보기

우리는 Kaggle의 신용 카드 사기 탐지 데이터 세트로 작업할 것입니다.

데이터 세트는 ~285,000건의 거래로 구성되어 있으며 그 중 492건만이 사기 거래입니다. 데이터는 "시간", "양", "클래스"의 31개 기능과 28개의 추가 익명 기능으로 구성됩니다. 클래스 기능은 거래가 사기인지 여부를 나타내는 레이블로, 0은 정상, 1은 사기를 나타냅니다. 모든 데이터는 숫자이고 연속적입니다(레이블 제외). 데이터 세트에 결측값이 없습니다. 데이터 세트는 시작하기에 이미 꽤 좋은 상태이지만 모든 기능의 평균을 0으로, 표준 편차를 1로 조정하는 등 조금 더 정리하겠습니다. 여기 노트북에서 청소 과정을 자세히 설명했습니다. 지금은 최종 결과만 보여드리겠습니다.

기능 대 클래스 그래프

이러한 분포에서 일반 데이터와 사기 데이터 간의 차이점을 쉽게 찾을 수 있지만 겹치는 부분도 많습니다. 더 빠르고 강력한 기계 학습 알고리즘 중 하나를 적용하여 사기 식별에 가장 유용한 기능을 식별할 수 있습니다. 이 알고리즘 xgboost는 그래디언트 부스트 결정 트리 알고리즘입니다. 데이터 세트의 70%에서 훈련하고 나머지 30%에서 테스트합니다. 테스트 데이터 세트에서 회수율(탐지된 사기 샘플의 비율)이 개선되지 않을 때까지 알고리즘이 계속되도록 설정할 수 있습니다. 이는 테스트 세트에서 76%의 재현율을 달성하므로 개선의 여지가 분명히 남습니다. 94%의 정밀도를 달성합니다. 이는 예측된 사기 사례의 6%만이 실제로 정상적인 거래였음을 의미합니다. 이 분석에서 우리는 사기 탐지에서 유용성을 기준으로 정렬된 기능 목록도 얻습니다. 나중에 결과를 시각화하는 데 가장 중요한 기능을 사용할 수 있습니다.

다시 말하지만, 사기 데이터가 더 많다면 더 잘 탐지할 수 있을 것입니다. 즉, 더 높은 리콜을 달성할 수 있습니다. 이제 GAN을 사용하여 실제 사기를 감지하는 데 도움이 되는 새롭고 현실적인 사기 데이터를 생성하려고 합니다.

GAN을 사용하여 새 신용 카드 데이터 생성

이 데이터 세트에 다양한 GAN 아키텍처를 적용하기 위해 Keras 라이브러리와 TensorFlow 백엔드를 사용하여 Python에서 구현된 많은 인기 있는 GAN 아키텍처가 있는 GAN-샌드박스를 사용할 것입니다. 내 모든 결과는 여기에서 Jupyter 노트북으로 사용할 수 있습니다. 쉬운 설정이 필요한 경우 필요한 모든 라이브러리가 Kaggle/Python Docker 이미지에 포함되어 있습니다.

GAN-Sandbox의 예제는 이미지 처리를 위해 설정됩니다. 생성기는 각 픽셀에 대해 3개의 색상 채널이 있는 2D 이미지를 생성하고 판별자/비평가는 이러한 데이터를 평가하도록 구성됩니다. 컨볼루션 변환은 이미지 데이터의 공간 구조를 활용하기 위해 네트워크 레이어 간에 활용됩니다. 컨볼루션 레이어의 각 뉴런은 공간 관계를 학습할 수 있도록 작은 그룹의 입력 및 출력(예: 이미지의 인접 픽셀)에서만 작동합니다. 우리의 신용 카드 데이터 세트에는 변수 사이에 공간 구조가 없기 때문에 컨볼루션 네트워크를 조밀하게 연결된 레이어가 있는 네트워크로 변환했습니다. 조밀하게 연결된 계층의 뉴런은 계층의 모든 입력 및 출력에 연결되어 네트워크가 기능 간의 자체 관계를 학습할 수 있도록 합니다. 각 아키텍처에 대해 이 설정을 사용하겠습니다.

첫 번째 GAN은 네트워크를 훈련하기 위해 판별기의 교차 엔트로피 손실을 사용하여 판별기 네트워크에 대해 생성기 네트워크를 평가할 것입니다. 이것이 원래의 "바닐라" GAN 아키텍처입니다. 내가 평가할 두 번째 GAN은 CGAN(조건부 GAN) 방식으로 데이터에 클래스 레이블을 추가합니다. 이 GAN에는 데이터에 클래스 레이블이라는 변수가 하나 더 있습니다. 세 번째 GAN은 Wasserstein 거리 메트릭을 사용하여 네트워크(WGAN)를 훈련하고 마지막 GAN은 클래스 레이블과 WCGAN(Wasserstein distance metric)을 사용합니다.

GAN 아키텍처

492개의 모든 사기 거래로 구성된 훈련 데이터 세트를 사용하여 다양한 GAN을 훈련할 것입니다. 조건부 GAN 아키텍처를 용이하게 하기 위해 사기 데이터 세트에 클래스를 추가할 수 있습니다. 노트북에서 몇 가지 다른 클러스터링 방법을 살펴보고 사기 데이터를 2개의 클래스로 분류하는 KMeans 분류를 사용했습니다.

5000 라운드 동안 각 GAN을 훈련하고 그 과정에서 결과를 조사하겠습니다. 그림 4에서 훈련이 진행됨에 따라 실제 사기 데이터와 다양한 GAN 아키텍처에서 생성된 사기 데이터를 볼 수 있습니다. 실제 사기 데이터를 2개의 KMeans 클래스로 나누어 이 두 클래스를 가장 잘 구별하는 2차원으로 표시한 것을 볼 수 있습니다(PCA 변환된 기능의 기능 V10 및 V17). 클래스 정보를 사용하지 않는 두 개의 GAN인 GAN과 WGAN은 생성된 출력을 모두 하나의 클래스로 가지고 있습니다. 조건부 아키텍처인 CGAN 및 WCGAN은 생성된 데이터를 클래스별로 표시합니다. 0단계에서 생성된 모든 데이터는 생성기에 공급되는 임의 입력의 정규 분포를 보여줍니다.

GAN 출력 비교

우리는 원래의 GAN 아키텍처가 실제 데이터의 모양과 범위를 학습하기 시작하지만 작은 분포로 축소되는 것을 볼 수 있습니다. 이것은 앞에서 논의한 모드 축소입니다. 생성기는 판별자가 가짜로 감지하기 어려운 작은 범위의 데이터를 학습했습니다. CGAN 아키텍처는 사기 데이터의 각 클래스의 분포를 확산하고 접근하여 조금 더 잘 수행하지만, 단계 5000에서 볼 수 있는 것처럼 모드 붕괴가 시작됩니다.

WGAN은 GAN 및 CGAN 아키텍처에서 나타나는 모드 붕괴를 경험하지 않습니다. 클래스 정보가 없어도 실제 사기 데이터의 비정규 분포를 가정하기 시작합니다. WCGAN 아키텍처는 유사하게 수행되며 별도의 데이터 클래스를 생성할 수 있습니다.

이전에 사기 탐지에 사용한 것과 동일한 xgboost 알고리즘을 사용하여 데이터가 얼마나 사실적으로 보이는지 평가할 수 있습니다. 빠르고 강력하며 많은 조정 없이 기성품으로 작동합니다. 실제 사기 데이터의 절반(246개 샘플)과 동일한 수의 GAN 생성 예제를 사용하여 xgboost 분류기를 훈련할 것입니다. 그런 다음 실제 사기 데이터의 나머지 절반과 다른 246개의 GAN 생성 예제 세트를 사용하여 xgboost 분류기를 테스트합니다. 이 직교 방법(실험적 의미에서)은 생성기가 실제 데이터를 생성하는 데 얼마나 성공적인지에 대한 표시를 제공합니다. 완벽하게 사실적인 생성 데이터로 xgboost 알고리즘은 0.50(50%)의 정확도를 달성해야 합니다.

정확성

GAN 생성 데이터의 xgboost 정확도는 처음에는 감소하다가 모드 축소가 시작됨에 따라 훈련 단계 1000 후에 증가하는 것을 볼 수 있습니다. CGAN 아키텍처는 2000 단계 후에 다소 더 현실적인 데이터를 달성하지만 모드 축소는 이 네트워크에 대해 다음과 같이 설정됩니다. 잘. WGAN 및 WCGAN 아키텍처는 보다 현실적인 데이터를 더 빨리 달성하고 교육이 진행됨에 따라 계속 학습합니다. WCGAN은 WGAN보다 우위에 있지 않은 것으로 보이며, 이는 생성된 클래스가 Wasserstein GAN 아키텍처에 유용하지 않을 수 있음을 시사합니다.

여기와 여기에서 WGAN 아키텍처에 대해 자세히 알아볼 수 있습니다.

WGAN 및 WCGAN 아키텍처의 비평가 네트워크는 주어진 데이터 세트와 실제 사기 데이터 사이의 Wasserstein(Earth-mover, EM) 거리를 계산하는 방법을 배우고 있습니다. 이상적으로는 실제 사기 데이터 샘플에 대해 0에 가까운 거리를 측정합니다. 그러나 비평가는 이 계산을 수행하는 방법을 배우는 과정에 있습니다. 실제 데이터보다 생성된 데이터에 대해 더 먼 거리를 측정하면 네트워크가 향상될 수 있습니다. 생성된 데이터와 실제 데이터에 대한 Wasserstein 거리의 차이가 훈련 과정에서 어떻게 변하는지 관찰할 수 있습니다. 그것이 정체되면 추가 훈련이 도움이 되지 않을 수 있습니다. 그림 6에서 이 데이터 세트에서 WGAN과 WCGAN 모두에 대해 추가 개선 사항이 있는 것으로 보입니다.

EM 거리 추정

우리는 무엇을 배웠습니까?

이제 실제 사기 데이터를 감지하는 데 도움이 될 만큼 현실적인 새로운 사기 데이터를 생성할 수 있는지 테스트할 수 있습니다. 가장 낮은 정확도 점수를 얻은 훈련된 생성기를 가져와 데이터를 생성하는 데 사용할 수 있습니다. 기본 교육 세트의 경우 사기가 아닌 데이터의 70%(199,020건)와 사기 데이터의 100건(사기 데이터의 ~20%)을 사용합니다. 그런 다음 최대 344개의 사례(사기 데이터의 70%)에 대해 실제 또는 생성된 사기 데이터의 다른 양을 이 훈련 세트에 추가하려고 합니다. 테스트 세트의 경우 사기가 아닌 사례(85,295건)와 사기 사례(148건)의 나머지 30%를 사용합니다. 훈련되지 않은 GAN과 가장 잘 훈련된 GAN에서 생성된 데이터를 추가하여 생성된 데이터가 랜덤 노이즈보다 나은지 테스트할 수 있습니다. 테스트 결과, 최고의 아키텍처는 훈련 단계 4800의 WCGAN으로 70%의 xgboost 정확도를 달성한 것으로 나타났습니다(이상적으로 정확도는 50%임을 기억하십시오). 따라서 우리는 이 아키텍처를 사용하여 새로운 사기 데이터를 생성할 것입니다.

그림 7에서 훈련을 위해 생성된 사기 데이터를 더 많이 사용함에 따라 재현율(테스트 세트에서 정확하게 식별된 실제 사기 샘플의 비율)이 증가하지 않는다는 것을 알 수 있습니다. xgboost 분류기는 100개의 실제 사례에서 사기를 식별하는 데 사용된 모든 정보를 유지할 수 있으며 수십만 개의 일반 사례 중에서 선택하더라도 추가로 생성된 데이터에 혼동되지 않습니다. 훈련되지 않은 WCGAN에서 생성된 데이터는 당연히 도움이 되거나 해를 끼치지 않습니다. 그러나 훈련된 WCGAN에서 생성된 데이터도 도움이 되지 않습니다. 데이터가 충분히 현실적이지 않은 것 같습니다. 그림 7에서 실제 사기 데이터를 사용하여 훈련 세트를 보완하면 회수율이 크게 증가한다는 것을 알 수 있습니다. WCGAN이 창의력을 전혀 발휘하지 않고 교육 예제를 복제하는 방법을 방금 배웠다면 실제 데이터에서 볼 수 있듯이 더 높은 재현율을 달성할 수 있었을 것입니다.

추가 데이터의 영향

무한과 그 너머로

실제 사기를 감지하는 데 도움이 될 만큼 현실적인 신용 카드 사기 데이터를 생성할 수는 없었지만 이러한 방법으로 표면을 거의 긁지 못했습니다. 더 큰 네트워크로 더 오래 훈련하고 이 기사에서 시도한 아키텍처에 대한 매개변수를 조정할 수 있습니다. xgboost 정확도 및 판별자 손실의 추세는 더 많은 교육이 WGAN 및 WCGAN 아키텍처에 도움이 될 것임을 시사합니다. 또 다른 옵션은 우리가 수행한 데이터 정리를 다시 방문하는 것입니다. 아마도 새로운 변수를 설계하거나 기능의 왜곡을 해결하는 경우와 방법을 변경할 수 있습니다. 아마도 사기 데이터의 다른 분류 체계가 도움이 될 것입니다.

다른 GAN 아키텍처도 시도해 볼 수 있습니다. DRAGAN은 Wasserstein GAN보다 더 빠르고 안정적으로 훈련한다는 이론 및 실험적 증거가 있습니다. 우리는 제한된 훈련 세트에서 학습 가능성을 보여준 semi-supervised learning을 사용하는 방법을 통합할 수 있습니다("GAN 훈련을 위한 개선된 기술" 참조). 인간이 이해할 수 있는 모델을 제공하는 아키텍처를 시도할 수 있으므로 데이터 구조를 더 잘 이해할 수 있습니다(InfoGAN 참조).

우리는 또한 이 분야의 새로운 발전을 주시해야 하며 마지막으로 가장 중요한 것은 빠르게 발전하는 이 공간에서 우리만의 혁신을 만들기 위해 노력할 수 있다는 것입니다.

이 GitHub 리포지토리에서 이 기사에 대한 모든 관련 코드를 찾을 수 있습니다.

관련 항목: TensorFlow에서 경사 하강법의 다양한 애플리케이션