카테고리 보관물: Book

“트랜스포머를 활용한 자연어 처리”가 출간되었습니다!

허깅페이스의 엔지니어인 루이스 턴스톨(Lewis Tunstall), 레안드로 폰 베라(Leandro von Werra), 토마스 울프(Thomas Wolf)가 쓴 아마존 베스트 셀러 <Natural Language Processing with Transformers>의 번역서 <트랜스포머를 활용한 자연어 처리>가 출간되었습니다!

트랜스포머 모델은 자연어 처리는 물론 딥러닝 분야에서 꼭 알아야할 아키텍처입니다. 트랜스포머 모델을 쉽게 훈련하고 공유할 수 있도록 돕는 허깅페이스 라이브러리는 현재 이 분야의 최첨단을 다루며 화제의 중심에 있습니다. 이 책에서 트랜스포머와 허깅페이스 생태계를 탐험해 보세요!

“트랜스포머를 활용한 자연어 처리” 번역을 마쳤습니다.

NLP 분야에서 아마존 베스트 셀러 자리에 오른 <Natural Language Processing with Transformers>의 번역 작업을 마쳤습니다. 이 책은 최근 대세인 허깅 페이스(Hugging Face) 라이브러리를 활용하여 다양한 NLP 작업을 해결하는 방법을 소개합니다. 허깅 페이스의 머신러닝 엔지니어들이 직접 쓴 책으로도 유명하고 <핸즈온 머신러닝 2판>의 저자 오렐리앙 제롱이 직접 추천사를 쓰고 크게 칭찬한 책입니다! 자연어 처리에 관심이 모든 분에게 자신있게 추천합니다! 🙂

  • 1장은 트랜스포머의 탄생을 다룹니다. 인코더-디코더, 어텐션, 전이 학습, 허깅 페이스의 트랜스포머스를 소개합니다. 간단한 파이프라인 객체를 사용해 텍스트 분류, 객체명 인식, 질문 답변, 요약, 번역, 텍스트 생성 예를 보여줍니다. 마지막으로 허깅 페이스 생태계로 허브, 토크나이저, 데이터셋, 액셀러레이트를 언급합니다.
  • 2장은 emotion 데이터셋을 사용한 텍스트 분류 예제를 다루면서 본격적으로 NLP 작업에 뛰어듭니다. 허깅 페이스 데이터셋의 구조를 자세히 소개하고 여러 토큰화 방법의 장단점을 언급합니다. 그다음 DistilBERT 모델을 베이스로 사용해 헤드만 훈련하는 경우와 전체 모델을 튜닝하는 전이 학습을 각기 수행해 봅니다. 전체적으로 파이토치 기반 모델을 사용하지만 중간중간 텐서플로 모델과 케라스에 대한 안내도 빠지지 않습니다. 훈련한 뒤 오차 행렬을 사용해 모델의 예측 결과를 분석하고 마지막으로 허브에 훈련된 모델을 업로드한 후 파이프라인으로 다시 추론에 활용하는 방법까지 다루고 있습니다.
  • 3장은 트랜스포머 구조를 자세히 소개합니다. 수학은 최소화하고 그림과 코드로 사용해 설명합니다. 먼저 인코더, 디코더를 포함해 트랜스포머의 전체 구조를 소개하고 인코더에 필요한 구성 요소를 하나씩 파헤칩니다. 셀프 어텐션, 멀티 헤드 어텐션, 피드 포워드, 정규화, 위치 임베딩 등입니다. 이런 요소를 직접 코드로 작성해 트랜스포머 인코더를 만듭니다. 이 과정에서 BertViz를 사용해 어텐션 가중치를 시각화해보기도 하고, 쿼리/키/값에 대한 재미있는 비유도 들을 수 있습니다. 디코더 부분은 마스킹에 대해 자세히 소개하고 다른 구성 요소 부분은 숙제로 남깁니다. 마지막으로 트랜스포머 계열의 모델을 인코더, 디코더, 인코더-디코더 유형으로 나누고 각 유형에서 마일스톤 격의 모델들을 소개합니다.
  • 4장은 다국어 텍스트의 개체명 인식(NER)을 다룹니다. 이 장에서 사용하는 데이터셋인 pan-x를 둘러 보고 베이스 모델로 사용할 XLM-RoBERTa를 소개합니다. 그다음 XLM-RoBERTa의 토크나이저인 SentencePiece를 WordPiece와 비교하여 설명합니다. 또 텍스트 분류와 NER 모델의 비슷한 점과 다른 점을 설명합니다. 허깅페이스에 있는 NER 클래스를 사용하지 않고 여기서는 XLM-RoBERTa를 베이스로 NER 작업을 위한 헤드를 직접 만들어 올립니다. 이 과정에서 허깅페이스의 모델 클래스의 구조와 여러 상속 관계를 배울 수 있습니다. 만든 모델에 사전 훈련된 가중치를 로드하고 독일어 텍스트로 미세 튜닝한 다음 모델의 오류를 분석합니다. 마지막으로 독일어에서 미세 튜닝한 모델을 프랑스어, 이탈리아어, 영어 텍스트에 적용해 봅니다. 결과는 어떨까요? 이번에는 독일어와 프랑스어 데이터를 합쳐서 모델을 미세 튜닝합니다. 그다음 다시 프랑스어, 이탈리아어, 영어 텍스트에 적용해 봅니다. 결과는 어떨까요? 마지막으로 각 언어에서 미세 튜닝하고 또 전체를 합쳐서 모델을 훈련한 다음 결과를 확인합니다.
  • 5장은 흥미로운 주제인 텍스트 생성 작업을 다룹니다. 이 장에서는 텍스트 생성 모델을 직접 훈련하기 보다는 유명한 GPT-2 모델을 사용해 텍스트 생성 작업에 대해 알아 봅니다. 먼저 그리디 서치와 빔 서치를 사용하여 텍스트를 생성해 보고 다양성이 높은 텍스트 생성을 위한 샘플링 방법으로 넘어가서 top-k와 top-p 방식을 배웁니다. 이 모든 방식을 허깅페이스 트랜스포머스 라이브러리에서 지원합니다. 마지막으로 최선의 텍스트 디코딩 방법에 대해 고찰하는 것으로 장을 마무리합니다.
  • 6장은 요약 작업을 다룹니다. 이 장에서 사용할 데이터셋은 요약 작업에 널리 사용되는 CNN/DailyMail 데이터셋입니다. 먼저 허깅페이스의 파이프라인으로 사전 훈련된 GPT-2, T5, BART, PEGASUS 모델을 사용해 샘플 데이터의 요약을 생성하고 결과를 비교해 봅니다. 이 과정에서 네 모델의 특징도 간략히 살펴 보고 있습니다. 그다음 생성된 텍스트의 품질을 정량적으로 평가하기 위해 BLEU와 ROUGE 점수의 이론적인 부분을 소개하고 샘플 텍스트에 적용해 봅니다. 그다음 가장 성능이 뛰어난 PEGASUS 모델로 CNN/DailyMail 데이터셋의 테스트 세트 일부를 사용해 ROUGE 점수를 계산하는 방법을 알아봅니다. 마지막으로 삼성이 만든 SAMSum 데이터셋에서 PEGASUS 모델을 적용해 보고, 이 데이터셋에서 미세 튜닝한 후 결과를 비교합니다. 이 모델을 사용해 임의로 만든 샘플 대화를 요약한 결과를 보여주는 것으로 이 장을 마칩니다.
  • 7장은 질문 답변(question-answering, QA) 작업을 다룹니다. 먼저 QA 작업을 간단히 소개하고 이 장에서 사용할 SubjQA 데이터셋을 준비합니다. QA 시스템을 만들기 위해 텍스트에서 가능한 답변을 찾아 내는 방법을 알아 봅니다. 이를 위해 사용할 수 있는 허깅 페이스 사전 훈련된 모델을 몇 가지 소개하고 그 중에 MiniLM을 선택합니다. 그다음 질문과 텍스트를 토큰화하고 모델에 통과시켜 출력된 결과에서 답의 범위를 찾습니다. 그다음에는 긴 텍스트를 다루기 위해 슬라이딩 윈도를 적용하는 방법을 알아 봅니다. 하지만 전체 문서에서 답을 찾기 위해서는 질문에 관련된 문서를 검색하는 시스템이 필요합니다. 이를 위해 헤이스택 라이브러리를 사용해 리트리버-리더(retriever-reader) 구조를 만듭니다. 헤이스택에서 제공하는 여러 리트리버를 소개하고 이와 같이 사용할 수 있는 문서 저장소도 알아 봅니다. 여기에서는 BM25 리트리버와 문서 저장소로 일래스틱서치를 사용합니다. 일래스틱서치를 설치하고 로컬에서 서버를 실행한 다음 SubjQA 데이터를 저장합니다. 이제 리트리버와 리더 객체를 초기화합니다. 리더는 앞에서와 같이 SQuAD에서 미세 튜닝된 MiniLM 모델입니다. 그다음 헤이스택 파이프라인으로 리트리버와 리더를 통합하여 테스트 질문에 대한 답을 추출해 봅니다. 이제 시스템 성능을 높이기 위해 리트리버와 리더를 평가할 수 있는 지표에 대해 알아 봅니다. 리트리버는 재현율을 사용해 평가합니다. 이를 위해 헤이스택의 사용자 정의 파이프라인을 만듭니다. 그다음 질문과 문서에 대해 밀집 벡터를 만들어 사용하는 DPR에 대해 알아 보고 앞서 만든 리트리버와 성능을 비교해 봅니다. 리더는 EM과 F-1 점수로 평가하며 두 지표의 장단점을 소개합니다. 마지막으로 MiniLM 모델을 SubjQA에 다시 미세 튜닝하여 전체 파이프라인의 성능을 비교해 봅니다. 추출적 QA 시스템 외에도 생성적 QA를 소개하고 헤이스택이 제공하는 RAG 모델을 사용해 질문에 대한 답변을 생성해 봅니다. 이 모든 작업을 코랩 노트북으로 테스트해 볼 수 있습니다.
  • 8장은 트랜스포머 모델의 성능 개선을 위한 도구를 알아 봅니다. 먼저 여러 성능 개선 방법을 적용해 보기 위해 BERT 기반 의도 탐지 모델을 선택합니다. 의도 탐지 작업에 대한 간단한 소개와 함께 CLINC150 데이터셋에서 미세 튜닝한 BERT 모델을 허깅페이스 파이프라인으로 사용해 봅니다. 그다음 여러 방법을 적용하면서 성능, 레이턴시, 메모리 사용량을 편리하게 비교하기 위해 벤치마킹 클래스를 준비합니다. 먼저 지식 정제(knowledge distillation) 방법에 대해 자세히 설명한 다음 BERT 기반 모델로 DistilBERT 모델을 훈련합니다. 이를 위해 사용자 정의 허깅페이스 Trainer 클래스를 만듭니다. 지식 정제로 훈련된 DistilBERT 모델은 BERT 기반 모델에 비해 정확도, 레이턴시, 크기가 어떻게 다를까요? 이번에는 옵투나(Optuna)로 앞서 만든 정제 모델에 대해 하이퍼파라미터 튜닝을 수행합니다. 이 모델의 정확도, 레이턴시, 크기는 어떻게 달라졌을까요? 다음은 양자화(quantization)를 소개합니다. 기본적인 양자화 방식을 자세히 배우고 여러 양자화 방식을 소개한 후 앞서 옵투나로 최적화한 모델에 양자화를 적용해 봅니다. 양자화를 적용한 후 모델의 정확도, 레이턴시, 크기는 어떻게 달라졌을까요? 이번에는 ONNX를 사용한 최적화를 적용해봅니다. 옵투나로 최적화한 모델을 ONNX 포맷으로 바꾸어 모델의 성능을 측정합니다. 그다음 ONNX 런타임에서 제공하는 양자화를 적용한 다음 다시 성능을 측정합니다. 어떤 모델의 정확도, 레이턴시, 크기가 제일 좋을까요? 마지막으로 가중치 가지치기에 대해 소개하며 이 장을 마칩니다.
  • 9장은 레이블링된 데이터가 전혀 없거나 조금만 있을 때 트랜스포머로 할 수 있는 일을 알아 봅니다. 이 장에서 사용하는 예제는 깃허브 이슈 내용을 바탕으로 적절한 태그를 다는 일입니다. 데이터셋을 준비한 다음 나이브 베이즈로 기준 모델을 만듭니다. 그다음 레이블링된 데이터가 전혀 없다고 가정하고 BERT 모델에 마스킹된 프롬프트를 주입하여 제로-샷 분류 작업을 시도해 봅니다. 이어서 자연어 추론을 위한 MNLI 데이터셋에서 훈련한 모델로 제로-샷 분류를 수행해 봅니다. 그리고 다중 레이블 분류에서 예측 레이블을 선택하는 방법을 소개합니다. 레이블링된 데이터가 적을 때는 데이터 증식을 사용할 수 있습니다. 이를 위해 NlpAug 라이브러리를 사용하여 토큰 교체를 적용하여 나이브 베이즈의 성능이 얼마나 향상되었는지 평가합니다. 그다음 방법은 텍스트 임베딩을 룩업 테이블처럼 사용해 최근접 이웃의 레이블을 예측으로 사용할 수 있습니다. 이 작업을 위해 페이스북의 FAISS 라이브러리를 사용하고 임베딩을 얻기 위해 파이썬 코드에서 훈련한 GPT-2 모델을 사용합니다. 마지막으로 레이블링된 데이터에서 트랜스포머 모델을 미세 튜닝하는 것입니다. 각 방법들의 성능을 평가하고 그래프로 비교합니다. 레이블링되지 않은 데이터가 많이 있다면 이를 활용하여 아예 언어 모델을 더 훈련할 수도 있습니다.
  • 10장은 트랜스포머 모델을 직접 훈련하는 과정을 소개합니다. 이 장에서 훈련할 모델은 파이썬 코드의 앞부분을 주입하면 나머지 부분을 완성해 주는 코드 자동 완성 트랜스포머입니다. 먼저 대용량 데이터셋에 관련된 어려움을 소개하고 깃허브의 오픈소스 파이썬 코드로부터 대용량 데이터셋을 구축합니다. 이 과정에서 허깅 페이스 데이터셋의 메모리 매핑과 스트리밍 기능을 알아 봅니다. 데이터셋을 준비했으니 다음으로 토크나이저를 훈련합니다. 이를 위해 GPT-2의 토크나이저를 사용합니다. 토크나이저 훈련 방법을 배우면서 BPE 알고리즘이나 유니코드 표현을 함께 살펴봅니다. 코드 자동 완성을 위한 훈련 목표를 결정하고 하이퍼파라미터는 gpt2-xl를 그대로 사용하여 모델을 초기화합니다. 마지막으로 데이터로더를 구성하고 허깅 페이스 엑셀러레이트를 사용해 훈련 루프를 만듭니다. 그다음 모델을 훈련하고 결과를 확인합니다.
  • 11장은 마지막 장으로 트랜스포머 모델을 확장할 때 어려움을 먼저 소개합니다. 그다음 어텐션 메커니즘을 효율적으로 만들기 위한 희소 어텐션과 선형 어텐션을 설명합니다. 최근 트랜스포머는 텍스트를 넘어서 비전과 음성에도 적용됩니다. iGPT, ViT와 테이블 데이터에 적용하는 TAPAS를 소개합니다. 마지막으로 멀티모달 트랜스포머로 wav2vec 2.0, VQA, LayoutLM, DALL·E, CLIP을 소개합니다. 끝으로 허깅 페이스 라이브러리를 더 많이 배울 수 있는 방법을 소개하는 것으로 책을 마칩니다.

“케라스 창시자에게 배우는 딥러닝 2판”이 출간되었습니다!

케라스(Keras) 라이브러리의 창시자 프랑소와 숄레(François Chollet)가 쓴 <Deep Learning with Python 2nd Edition>의 번역서 <케라스 창시자에게 배우는 딥러닝 2판>이 출간되었습니다!

1판의 거의 모든 부분의 내용이 바뀌거나 새롭게 추가되었습니다. 컴퓨터 비전과 자연어 처리 분야의 새로운 예제가 추가 되었고 트랜스포머 모델을 밑바닥부터 만들어 볼 수 있습니다!

이 책은 특별히 풀컬러 양장본으로 출간되었습니다. 좋은 책을 오래 소장할 수 있도록 아낌없는 투자를 해 주신 길벗 출판사에 감사드립니다. 제일 좋아하는 책 중에 하나가 양장으로 출간되다니 너무 기쁩니다! ㅎ

지금 온라인/오프라인 구매가 가능합니다! [예스24] [교보문고] [알라딘]

“개발자를 위한 머신러닝&딥러닝” 책이 출간되었습니다!

구글의 수석 AI 애드보커트인 로런스 모로니(Laurence Moroney)가 쓴 아마존 베스트셀러 <AI and Machine Learning For Corders>를 번역한 <개발자를 위한 머신러닝&딥러닝> 책이 출간되었습니다!

이 책은 어려운 이론을 들먹이지 않고 직관적인 설명과 쉬운 비유로 신경망과 딥러닝의 정글을 헤쳐 나갑니다. 인공지능 석학 중 한명인 앤드류 응(Andew Ng)이 추천한 이 책으로 로런스 모로니와 흥미진진한 여행을 떠나보시죠! 여행 지도는 다음과 같습니다! 🙂

온라인/오프라인 서점에서 판매중입니다! [예스24] [교보문고] [알라딘] [한빛미디어]

“케라스 창시자에게 배우는 딥러닝 2판”, “개발자를 위한 머신러닝&딥러닝” 출간 소식

올해 상반기에 작업한 <케라스 창시자에게 배우는 딥러닝 2판>과 <개발자를 위한 머신러닝&딥러닝> 책이 곧 출간될 예정입니다. 아마 두 책 모두 다음 주 중에 예약 판매가 시작되고 이달 말에 배송이 될 것 같습니다.

<케라스 창시자에게 배우는 딥러닝 2판>은 길벗 출판사의 머신러닝 시리즈 디자인을 선택하지 않고 특별히 원서 표지를 사용합니다. 또 고급 양장본으로 출간됩니다! 출판사에서 이렇게 한 책에 특별한 예외를 두는 것은 쉬운 일이 아닙니다. 이 책의 가치를 믿고 독자들의 의견을 적극 수용해 주신 덕분입니다. 이 책은 읽는데서 끝나지 않고 소장할 가치가 있는 거죠! 저에게도 아주 큰 영광입니다. 양장 도서를 갖게 되다니요! 🙂

<개발자를 위한 머신러닝&딥러닝>은 저자 로런스 모로니에게 출간 소식을 전했더니 특별히 스타필드 별마당도서관에 진열되었으면 좋겠다고 하네요. ㅎ

두 책 모두 기대하셔도 좋습니다. 감사합니다!

“개발자를 위한 AI & ML” 도서 번역을 마쳤습니다.

아마존 베스트셀러인 <AI and Machine Learning for Coders> 번역을 마쳤습니다. 이 책은 구글의 Lead AI Advocate인 로런스 모로니(Laurence Moroney)가 썼고, 코세라 창업자이자 딥러닝 4대 석학 중 하나인 앤드류 응(Andrew Ng)이 추천사를 쓴 책입니다.

출판사에서 후반 작업을 거쳐야 하지만 8월 안에는 번역서를 만나 볼 수 있지 않을까 기대해 봅니다. ㅎㅎ

전체 책을 한 눈에 볼 수 있도록 요약한 그래픽과 각 장의 요약을 참고하세요! 🙂

  • 1장은 개발자 입장에서 머신러닝과 텐서플로가 무엇인지 설명하고, 텐서플로를 사용하기 위한 환경을 준비합니다. 마지막으로 두 숫자 리스트 사이의 관계를 학습하는 초간단 텐서플로 모델을 만듭니다.
  • 2장에서는 밀집 층을 사용한 컴퓨터 비전 예시를 다룹니다. 사용하는 데이터셋은 패션 MNIST입니다. 저자의 의도는 수학과 이론을 배제하고 딥러닝을 소개하는 것입니다. 그래서 고수준으로 쉽게 개념을 풀어 설명하고 있습니다. 또 모델을 오래 훈련했을 때 일어나는 과대적합에 대해 설명하고 콜백을 사용한 간단한 조기종료 기법을 선보입니다.
  • 3장은 컴퓨터 비전을 위해 합성곱과 풀링을 사용하여 조금 더 복잡한 예제를 다룹니다. 여기에서는 저자가 직접 컴퓨터 그래픽으로 만든 데이터셋인 말-사람 데이터셋을 사용합니다. ImageDataGenerator를 사용해 데이터 증식하는 법을 소개합니다(원서보다 나은 번역서를 지향하므로 image_dataset_from_directory 함수와 케라스 전처리 층을 사용하는 법을 역자 노트로 추가했습니다). 이어서 전이 학습을 소개하고 인셉션 v3를 사용해 동일한 데이터셋에서 전이 학습 모델을 훈련합니다. 마지막으로 역시 저자가 컴퓨터 그래픽으로 만든 가위,바위,보 데이터셋으로 다중 분류 모델을 훈련하고 드롭아웃 규제를 적용합니다!
  • 4장은 텐서플로 데이터셋을 소개합니다. tfds를 사용하여 공개된 데이터셋을 손쉽게 로드하는 방법과 데이터셋의 상세 정보를 조회하는 방법을 배웁니다. 그다음 tfds를 사용해 케라스 모델을 만들고 훈련해 봅니다. 데이터 증식과 분할 비율을 지정하여 로드하는 방법도 소개합니다. 또한 TFRecord 구조를 소개하고 CPU/GPU를 최대한 활용할 수 있는 방법도 안내합니다.
  • 5장부터는 RNN을 다룹니다. 5장에서는 기초적인 내용을 다룹니다. 토큰화, 패딩을 소개하고 뷰티풀수프로 텍스트를 정제하는 방법도 소개합니다. tfds로 IMDb 데이터셋을 로드하여 정제하는 과정을 밟아 보고 CSV 파일과 JSON 파일에서 데이터를 로드하는 방법도 배울 수 있습니다. 번역서에는 TextVectorization 층을 사용하는 예시도 추가했습니다!
  • 6장은 5장에 이어 텍스트 데이터를 다룹니다. 하지만 이번에는 RNN이 아니라 임베딩 층과 밀집 층을 사용합니다. 6장의 목표는 직관적으로 임베딩을 이해할 수 있도록 돕는 것입니다. 여기에서는 IMDb 대신 Sarcasm 데이터셋을 사용하며 임베딩 층의 출력을 밀집 층으로 주입하기 위해 전역 풀링을 사용합니다. 만들어진 임베딩 벡터를 텐서플로의 임베딩 프로젝터로 시각화해 봅니다. 마지막으로 직접 임베딩을 훈련하는 대신 텐서플로 허브에서 사전 훈련된 임베딩을 사용하는 방법을 소개하는 것으로 마칩니다!
  • 7장은 순환 모델의 필요성을 언급하고 피보나치 수열을 사용해 순환 뉴런의 작동 방식을 설명합니다. Sarcasm 데이터셋에 양방향 LSTM 층을 적용합니다. 이 모델을 개선하기 위해 순환 층을 쌓는 방법과 과대적합을 완화하기 위해 드롭아웃을 적용하는 방법을 소개합니다. 마지막으로 GloVe 임베딩을 사용해 사전 훈련된 임베딩 벡터를 사용하는 모델을 만드는 것으로 마칩니다.
  • 8장은 텍스트 분류 작업을 넘어서 텍스트를 생성하는 모델을 만들어 봅니다. 시드 문장에서 시작하여 한 단어씩 예측하여 시드 문장에 추가하는 식으로 텍스트를 생성합니다. LSTM 층을 사용해 아일랜드 시를 학습해 새로운 텍스트를 생성합니다. 모델을 개선하기 위해 순환 층을 쌓고 데이터셋을 확장합니다. 마지막으로 문자 기반 생성 모델에 대해 소개합니다.
  • 9장은 시계열 데이터를 다룹니다. 시계열 데이터의 특징인 트렌드, 계절성, 자기상관, 잡음 등에 대해 설명합니다. 합성된 데이터를 사용해 베이스라인으로 단순한 예측을 만드는 모델을 만듭니다. 먼저 현재 타임스텝 데이터로 한 스텝 앞을 예측하는 것과 이동 평균과 계절성을 사용해 예측하는 방법을 소개합니다!
  • 10장은 시계열 데이터에 심층 신경망을 적용하여 문제를 풉니다. 이를 위해 tf.data를 사용해 윈도 데이터셋을 만드는 방법을 알아 봅니다. 밀집 층을 사용한 모델로 훈련한 다음 케라스 튜너를 사용하여 최적의 하이퍼파라미터를 찾아 봅니다!
  • 11장은 계속하여 합성 시계열 데이터에 1D 합성곱을 적용하는 방법을 배웁니다. 그다음 케라스 튜너로 다시 한번 하이퍼파라미터 튜닝을 수행해 봅니다. 시계열 데이터에 RNN을 적용하기 전에 실전 데이터로 넘어갑니다. NASA 날씨 데이터와 KNMI 날씨 데이터를 사용합니다. SimpleRNN, GRU, LSTM, 드롭아웃, 양방향 RNN을 여기에 모두 적용해 봅니다.
  • 12장부터는 텐서플로 라이트를 소개합니다. 훈련된 간단한 모델을 텐서플로 라이트로 변환하고 예측을 수행하는 과정을 단계별로 차근차근 설명합니다. 그다음 전이 학습으로 만든 강아지-고양이 이미지 분류 모델을 텐서플로 라이트로 변환하고 양자화를 통해 모델을 최적화하는 방법까지 소개합니다!
  • 13장은 안드로이드 앱에서 텐서플로 라이트를 사용하는 방법을 소개합니다. 안드로이드 스튜디오를 사용해 새 프로젝트를 만들고, 텐서플로 라이트 모델을 추가하고, 추론에 사용하는 방법을 단계별로 안내합니다. 다음으로 강아지-고양이 분류 모델을 사용해 앱에서 이미지를 처리하는 예제를 다룹니다.
  • 14장은 iOS 앱에서 텐서플로 라이트를 사용하는 방법을 소개합니다. 13장과 마찬가지로 Xcode를 사용해 간단한 모델을 사용해 단계적으로 텐서플로 라이트를 사용하는 방법을 안내합니다. 그다음 강아지-고양이 분류 모델을 사용한 앱을 만들어 봅니다.
  • 15장부터는 TensorFlow.js를 사용하는 방법을 배웁니다. 텐서플로 생태계 입장에서 TensorFlow.js에 대해 소개하고 웹 개발 환경을 셋팅합니다. 첫 번째 TensorFlow.js 예제로 간단한 방정식 예측 모델을 만들고 그다음으로 붓꽃 분류 모델을 자바스크립트로 만드는 예제를 다룹니다!
  • 16장은 TensorFlow.js로 브라우저에서 MNIST 숫자 이미지를 분류하는 모델을 훈련합니다. 먼저 브라우저로 모델을 훈련할 때 고려할 사항을 안내합니다. 그다음 자바스크립트로 CNN 모델을 구성하고 tfjs-viz 스크립트를 사용해 훈련 과정을 시각화하는 방법을 배웁니다. 스프라이트 시트로 구성된 훈련 이미지를 사용해 모델을 훈련하고 마지막으로 훈련된 모델에서 추론을 수행합니다.
  • 17장은 기존에 훈련된 텐서플로 모델을 자바스크립트에서 사용하는 방법을 안내합니다. 먼저 텐서플로에서 훈련된 모델을 tensorflowjs로 변환하는 방법을 배웁니다. 그다음 tfjs-models 저장소에 있는 모델을 재사용하는 방법을 안내합니다. 이를 통해 유해 텍스트를 걸러내거나 MobileNet을 사용해 이미지를 분류하거나 PoseNet으로 신체 부위를 감지할 수 있습니다.
  • 18장은 TensorFlow.js를 사용한 전이학습을 다룹니다. ImageNet 데이터셋에서 훈련한 MobileNet 모델을 베이스 모델로 사용해 가위,바위,보 손 모양 이미지를 분류하는 모델을 단계별로 안내합니다. 그다음 텐서플로 허브를 사용하여 전이학습을 수행하는 방법을 소개합니다. 마지막으로 TensorFlow.org에서 제공하는 모데을 사용해 전이학습을 수행하는 방법을 소개합니다.
  • 19장은 모델 배포를 다룹니다. 텐서플로 서빙을 소개하고 도커와 리눅스에 설치하는 방법을 안내합니다. 그다음 간단한 숫자를 예측하는 모델을 텐서플로 서빙으로 배포하는 방법을 실습합니다.
  • 20장은 인공지능의 윤리, 공정성, 개인 정보 보호에 대해 다룹니다. 먼저 이모티콘 사례를 들어 프로그래밍의 공정성과 기술 부채에 대해 설명합니다. 머신러닝의 공정성을 위한 도구로 what-if와 패싯을 소개합니다. 그다음 연합 학습 절차를 간단한 예를 들어 단계별로 설명합니다. 마지막으로 구글 AI 원칙을 소개하면서 책을 마무리합니다.

[Deep Learning with Python] 2판 번역 완료!

케라스(Keras) 라이브러리를 만든 프랑소와 숄레(François Chollet)의 딥러닝 책인 <Deep Learning with Python>의 2판 번역을 마쳤습니다. 원서는 현재 아마존에서 신경망 분야에서 5위에 랭크되어 있습니다. 예상대로 프랑소와의 책이라 매우 높은 인기를 얻고 있네요. 🙂

2판은 1판에 비해 많은 내용이 추가되고 콘텐츠 배열에도 변화가 있었습니다. 가장 대표적인 변화는 텐서플로 2.0 적용, 새로운 케라스 API, 합성곱과 순환 신경망 예제, 트랜스포머 추가 등입니다.

1판과 2판의 차이를 한눈에 보기 쉽게 그림으로 그려보았습니다. 그 아래에는 조금 더 자세히 2판의 장마다 1판의 어떤 부분과 연관이 있는지 새롭게 추가된 부분은 무엇인지 요약했습니다. 책을 보시는데 도움이 되셨으면 좋겠습니다. 이 번역서는 길벗 출판사를 통해 <케라스 창시자에게 배우는 딥러닝 2판>으로 곧 찾아뵙겠습니다! 🙂

  • 1장에 큰 변화는 없고 그간 바뀐 세상 물정을 반영했습니다. 1장에서부터 트랜스포머스를 언급합니다.
  • 2장의 구성은 1판과 비슷합니다. 아핀 변환, 경사 하강법, 연쇄 법칙에 대해 그림과 코드을 추가하여 자세히 설명합니다. 텐서플로의 그레이디언트 테이프를 소개하고 이를 사용해 간단한 완전 연결 신경망을 “밑바닥”부터 구현하는 예제가 추가되었습니다.
  • 1판 3장의 전반부가 확대되어 2판에서는 독립적인 3장이 되었습니다. 텐서플로와 케라스 히스토리를 조금 더 자세히 소개하고 딥러닝 작업 환경을 설명하는 부분에 코랩이 추가되었습니다. 2장에서 살짝 언급한 텐서, 변수, 그레이디언트 테이프를 다시 자세히 소개하고, 전반적인 케라스 모델 API를 소개합니다. 특히 build, call, __call__ 메서드의 존재 이유를 상세히 설명하는 부분이 눈에 띄네요.
  • 4장은 1판의 3장 후반부 예제 세 개(이진 분류, 다중 분류, 회귀)를 그대로 사용하며 내용도 거의 변화가 없습니다.
  • 1판 4장의 일부 절들이 확장되어 2판의 5장이 되었습니다. 특히 1판에 없던 과대적합의 발생 원인과 일반화란 무엇인지에 대해 매우 상세하게 설명하고 있는 점이 돋보입니다. 또한 훈련 성능을 높이기 위한 방법도 추가되었습니다.
  • 6장은 1판 4장의 마지막 절에서 간단히 소개한 머신러닝 워크플로를 확장했습니다. 문제 정의, 데이터 수집, 데이터 관련 주의 사항, 성공 지표, 전처리, 모델 개발, 규제, 튜닝, 여러가지 배포 옵션, 최적화, 유지 관리까지 모델의 전 생애주기를 다룹니다.
  • 1판은 비교적 책 후반에 함수형 API와 텐서보드를 소개합니다. 2판에서는 중간 부분으로 전진 배치 되었습니다. 2판 7장에서는 함수형 API는 물론 모델의 서브클래싱 방법, 이들을 섞어 쓰는 방법까지 자세히 소개합니다. 또한 사용자 정의 지표, 사용자 정의 콜백, 사용자 정의 훈련 루프까지 체계적으로 설명을 풀어갑니다. 훈련과 추론 로직을 완전히 밑바닥부터 새로 만드는 방법과 기존의 fit(), evaluate()를 사용하면서 나만의 알고리즘을 적용하는 방법도 모두 설명하네요.
  • 1판의 5장 합성곱 신경망이 2판에서는 두 개의 장으로 확대되었습니다. 앞부분의 고양이vs강아지 데이터셋을 사용한 컨브넷 예제들은 8장이 되었고 뒷부분의 합성곱 시각화 부분은 9장으로 넘어갔습니다. 8장의 내용은 이전과 거의 동일합니다. 주된 변경 사항은 기존의 제너레이터를 사용한 모델 훈련과 데이터 증식을 텐서플로 데이터셋과 케라스에 추가된 이미지 증식 층으로 바꾸었습니다. 덕분에 코드는 훨씬 간결하고 이해하기 쉬워졌네요. 이제 고급 컴퓨터 비전을 다루는 9장으로 넘어갑니다.
  • 9장은 고급 컴퓨터 비전을 다룹니다. 1판에 없었던 Oxford-IIIT Pet 데이터셋을 사용한 이미지 분할 예제가 추가되었습니다. 그다음 1판 7장에 있던 고급 딥러닝 구조(잔차 연결, 배치 정규화, 깊이별 분리 합성곱)가 9장으로 옮겨 왔습니다. 세 구조에 대한 설명이 크게 개선되었고 합성곱 신경망 구조의 일반적인 패턴에 대한 식견을 피력하는 절이 돋보입니다. 그다음은 1판 5장에 있던 합성곱 시각화 부분이 이어집니다. 1판에서는 필터 시각화와 히트맵 시각화를 위해 VGG16 모델을 썼었는데 2판에서는 Xception 모델을 사용합니다.
  • 1판 RNN 장이 2판에서 2개 장으로 확대되었습니다. 10장에서는 예나 온도 예제, RNN, 1D 컨브넷, LSTM, 드롭아웃, 스태킹 RNN, 양방향 RNN을 다룹니다. 자연스럽게 LSTM 등의 예제는 IMDB가 아니라 예나 데이터셋을 사용합니다. 1판과 크게 달라진 점은 제너레이터 방식이 아니라 새로운 timeseries_dataset_from_array 함수를 사용하여 코드가 훨씬 간결해졌습니다!
  • 11장은 이 책에서 가장 긴 장입니다. 1판 6장의 IMDB 텍스트 분류 예제를 주로 다루지만 완전히 새로 쓰여졌습니다. 먼저 TextVectorization 층과 함께 텍스트 전처리에 대해 자세히 소개합니다. BoW와 n-그램도 더욱 자세히 설명하고 1판에 없던 tf-idf 예제도 추가되었습니다. TextVectorization 층을 tf.data 파이프라인 또는 모델에 포함시킬 때를 명확하게 짚어주니 아주 좋네요. 그다음은 자연스럽게 임베딩 층으로 넘어가 사전 훈련된 단어 벡터를 사용하는 것까지 진행됩니다. 텍스트 분류에서 BoW와 RNN을 선택하는 기준에 대한 경험 법칙도 소개합니다. 이제 11장의 나머지 절반은 온통 트랜스포머 이야기입니다. 수식을 사용하지 않으면서 단계적으로 이해하기 쉽게 설명하는 저자의 능력이 여기에서 빛을 발합니다. 셀프 어텐션, 멀티 헤드 어텐션, 트랜스포머 인코더, 위치 임베딩까지 진행한 다음 다시 IMDB 텍스트를 분류해 봅니다. 그다음 텍스트 분류를 넘어서 기계 번역 예제(영어->스페인어)로 이동합니다. 먼저 LSTM으로 seq2seq 모델을 만들면서 인코더, 디코더의 상호 작용을 이해합니다. 그다음 트랜스포머 디코더를 만들고 트랜스포머 인코더와 합쳐서 완전한 기계 번역 모델을 만듭니다! 와우!!! 🙂
  • 12장은 생성 딥러닝을 다루며 1판의 8장과 구성이 비슷합니다. 텍스트 생성, 딥드림, 뉴럴 스타일 트랜스퍼, 변이형 오토인코더, GAN을 다룹니다. 1판과 다른 점은 LSTM과 세익스피어 데이터셋 대신 트랜스포머 디코더와 IMDB 데이터셋을 사용해 텍스트 생성 예제를 만듭니다. DCGAN 예제에서는 CIFAR10 데이터셋 대신에 CelebA 데이터셋을 사용합니다. 물론 전체 코드는 대부분 서브클래싱 방식과 최신 케라스 API로 바뀌었습니다.
  • 13장은 실전을 위한 모범 사례를 다룹니다. 원래 1판 7장에 있던 모범 사례는 (앙상블을 제외하고) 대부분 2판에서 다른 장으로 흡수되었습니다. 따라서 2판 13장에 들어간 모범 사례는 모두 새로 작성한 것입니다. 하이퍼파라미터 튜닝을 위해 KerasTuner를 소개하고, 혼합 정밀도를 사용한 훈련, 다중 GPU 훈련과 코랩 TPU 사용 방법까지 다룹니다.
  • 14장은 1판의 마지막 장과 유사하게 전체 내용을 정리하고 딥러닝에 대한 저자의 해석과 전망을 담고 있습니다. 하지만 내용이 많이 확대되었습니다. 지능이란 무엇인지, 왜 생겼는지 탐구해 보고 어떻게 달성할 수 있는지 질문합니다. 이 질문에 대한 대답으로 일반화를 달성하기 위한 추상화와 프로그램 합성을 엮어서 이야기를 풀어 갑니다. 이 장은 몇 년전 프랑소와가 쓴 지능 측정에 대한 논문에서 중요 내용을 요약한 것 같습니다. 프랑소와가 그리는 미래를 여기서 볼 수 있습니다!

“파이썬 라이브러리를 활용한 머신러닝” 사이킷런 1.1 버전 업데이트

최근 릴리스된 사이킷런 1.1.x 버전에서 변경된 부분에 맞춰 <(번역개정2판) 파이썬 라이브러리를 활용한 머신러닝>의 본문 내용을 다음과 같이 업데이트합니다!

  1. (p102) 사이킷런 1.3 버전부터 SGDClassifier의 loss 매개변수 중 로지스틱 손실을 의미하는 'log'가 'log_loss'로 바뀔 예정이므로 첫 번째 줄에서 “훈련합니다.”를 “훈련합니다(1.3 버전에서 'log'가 'log_loss'로 바뀔 예정입니다).“로 수정합니다.
  2. RandomForestClassifier와 ExtraTreesClassifier의 max_features 매개변수 기본값이 'auto'에서 'sqrt'로 바뀔 예정이므로,
    • (p127) 주석 47번을 다음과 같이 바꿉니다. “RandomForestClassifier의 max_features 기본값이 'auto'로 sqrt(n_features)를 의미합니다. 1.3 버전에서는 max_features 기본값이 'auto'에서 'sqrt'로 바뀔 예정입니다.
    • (p143) 표 2-2에서 랜덤포레스트와 엑스트라트리의 ‘특성 개수’ 항목을 다음과 같이 수정합니다.
      분류: max_features=’auto’ (1.3 버전에서 ‘sqrt’로 변경예정)
      회귀: 전체 특성
    • (p315) 주석 20번에서 “랜덤 포레스트의 기본값은 "auto"로 특성 개수의 제곱근을 나타내며, … 하지만 max_features="auto"로 설정하면…”을 “랜덤 포레스트 분류기는 기본적으로 특성 개수의 제곱근을 사용하며, … 하지만 max_features="sqrt"로 설정하면…”로 수정합니다.
  3. GradientBoostingClassifier의 loss 매개변수 기본값이 1.3 버전에서 'deviance'에서 'log_loss'로 바뀔 예정이므로
    • (p128) 주석 50번 네 번째 줄에서 “손실을 의미하는 'deviance'입니다.”를 “손실을 의미하는 'deviance'입니다(1.3 버전에서 'deviance'가 'log_loss'로 바뀔 예정입니다).”로 수정합니다.
    • (p143) 표 2-2의 그레이디언트 부스팅의 ‘손실 함수’ 항목에서 “(로지스틱 회귀)”를 “(로지스틱 손실. 1.3 버전에서 'log_loss'로 바뀔 예정)”으로 수정합니다.
  4. (p143) HistGradientBoostingClassifier의 loss 매개변수 기본값이 1.3 버전에서 'auto'에서 'log_loss'로 바뀔 예정이므로 표 2-2의 히스토그램 기반 부스팅의 ‘손실 함수’ 항목에서 “(이진분류는 'binary_crossentropy', 다중 분류는 'categorical_crossentropy')”을 “(로지스틱 손실. 1.3 버전에서 'log_loss'로 바뀔 예정)”로 수정합니다.
  5. (p297) 버전 1.1에서 OneHotEncoder 클래스에 자주 등장하지 않는 범주를 하나로 묶어주는 min_frequency와 max_categories 매개변수가 추가 되었습니다. 4.2절 아래 세 번째 줄에서 “OneHotEncoder 클래스에 구현되어 있습니다.”를 “OneHotEncoder 클래스에 구현되어 있습니다.<주석>옮긴이_ 버전 1.1에서 추가된 min_frequency 매개변수를 사용하면 특정 횟수 또는 비율 보다 적게 등장하는 범주를 하나의 특성으로 합칠 수 있습니다. 또한 max_categories 매개변수를 사용하여 원-핫 인코딩으로 만들어지는 특성의 개수를 제한할 수 있습니다.</주석>“로 수정합니다.

감사합니다! 🙂

텐서플로 2.9 버전이 릴리스되었습니다.

며칠 전 텐서플로 2.9버전이 릴리스되었습니다. 주요 변경 사항을 텐서플로 블로그에 소개했습니다. 요약하면 다음과 같습니다.

  • 텐서플로 2.5버전에서 실험적으로 포함되었던 인텔 oneDNN 라이브러리에 대한 최적화가 2.9버전에서 기본적으로 활성화됩니다(리눅스 패키지와 캐스케이드 레이크 이후의 CPU).
  • 모델 병렬화를 위한 DTensor API가 추가되었습니다. 자세한 내용은 DTensor Concepts, Distributed ML with DTensors, Using DTensors with Keras 문서를 참고하세요.
  • tf.function의 트레이싱 방식을 개선했습니다.
  • 텐서플로 2.8 버전에서 소개된 tf.config.experimental.enable_op_determinism()의 기능을 개선하여 실행마다 동일한 결과를 얻을 수 있습니다.
  • 옵티마이저 커스터마이징을 용이하게 하기 위해 tf.keras.optimizers.experimental API가 추가되었습니다. 향후 tf.keras.optimizers.experimentaltf.keras.optimizers.Optimizer를 대체합니다.

이 외에도 다양한 기능이 추가되고 변경되었습니다. Revisiting ResNets 모델인 tf.keras.applications.resnet_rs, L2 정규화 층인 tf.keras.layers.UnitNormalization, 새로운 규제 층인 tf.keras.regularizers.OrthogonalRegularizer, 새로운 이미지 전처리 층인 tf.keras.layers.RandomBrightness가 추가되었습니다. 더 자세한 내용은 텐서플로 릴리스 노트를 참고하세요!

<혼자 공부하는 머신러닝+딥러닝> 7장부터 시작하는 딥러닝 파트의 코드를 텐서플로 2.9 버전에서 모두 테스트하여 깃허브에 업데이트했습니다!

항상 최신 버전의 라이브러리에서 테스트하여 예제 코드에 문제가 없도록 하겠습니다! 감사합니다!

XGBoost 1.6 버전 릴리즈와 [XGBoost와 사이킷런을 활용한 그레이디언트 부스팅] 업데이트 안내

지난 달에 XGBoost 1.6 버전이 릴리스되었습니다. 무엇보다도 이번에 범주형 변수에 대한 지원이 확대된 것이 눈에 띱니다. 1.5버전에서 'gpu_hist'만 범주형 변수를 지원했는데 1.6 버전에서는 'hist', 'approx'에서도 범주형 변수를 지원합니다. 또 LightGBM처럼 원-핫 인코딩을 위한 범주 개수의 임곗값을 지정하는 max_cat_to_onehot 매개변수가 추가되었습니다. 기본값은 4입니다.

또한 다중 출력 모델을 지원하고, 'approx' 트리 메서드를 'hist'를 기반으로 재작성했으며, 모델 저장을 위해 UBJSON 포맷을 지원합니다. 이외에도 많은 기능이 추가, 개선되었습니다. 자세한 내용은 XGboost 릴리스 노트를 참고하세요.

<XGBoost와 사이킷런을 활용한 그레이디언트 부스팅>의 깃허브 코드는 사이킷런 1.1과 XGBoost 1.6에서 모두 테스트되었습니다.

다음은 두 라이브러리의 버전 변경으로 인해 수정할 내용입니다.

  1. (노트: 2022년 5월 현재 코랩의 파이썬 버전은 3.7.x로 사이킷런 1.0.x만 설치됩니다. 코랩을 사용하는 경우 이 항목의 수정 사항을 무시하세요) 사이킷런 1.1 버전에 따른 변경 사항
    • (p95, p96) DecisionTreeClassifier와 DecisionTreeRegressorExtraTreeClassifierExtraTreeRegressorRandomForestClassifierRandomForestRegressorExtraTreesClassifierExtraTreesRegressor의 max_features 매개변수 중 'auto'가 'sqrt'와 동일합니다. 1.3 버전에서 'auto'가 삭제된다는 deprecated 경고가 발생하므로 'auto'를 'sqrt'로 변경합니다.
      (p95) 위에서 9번째 줄, (p96) 위에서 3번째 줄, (p119) 아래에서 6번째 줄, (p120) 위에서 7번째 줄과 아래에서 9번째 줄, (p121) 위에서 4번째 줄과 아래에서 12번째 줄.
  2. XGBoost 1.6 버전에 따른 변경 사항
    • 1.6 버전에서 use_label_encoder 매개변수 기본값이 True에서 False로 변경되었습니다. 따라서 타깃 레이블을 0부터 인코딩해야 합니다.
      (p149) 위에서 13번째 줄에서 y = df.iloc[:,0]을 y = df.iloc[:,0] - 1로 수정합니다.
      (p221) 위에서 3번째 줄에서 y = df.iloc[:,0]을 y = df.iloc[:,0] - 1로 수정합니다.
      (p232) 위에서 8번째 줄에서 “recall_score() 함수를 호출하려면 y_testy_pred와 함께 pos_label=2로 지정해야 합니다”를 “recall_score() 함수를 호출하려면 y_test와 y_pred를 전달해야 합니다”로 수정합니다. 그 아래 recall_score() 함수 호출에서 pos_label=2를 삭제합니다.
      (p233) 아래에서 7번째 줄에서 y = df.iloc[:,0]을 y = df.iloc[:,0] - 1로 수정합니다. 아래에서 1번째 줄에서 pos_label=2를 삭제합니다.
      (p237) 위에서 2번째 줄에서 df_train[df_train['LABEL']==2].values를 df_train[df_train['LABEL']==1].values로 수정합니다. 아래에서 1번째 줄에서 pos_label=2를 삭제합니다.
    • (p352) 1.6 버전에서 범주형 변수에 대한 지원이 추가되었습니다. 두 번째 문단 끝에 “1.6버전에서는 'approx'와 'hist'에서도 범주형 변수를 지원합니다.”를 추가합니다.