대규모 언어 모델(Large Language Models, LLMs)

1. LLM이란?

  • "Large Language Model"의 약자로, 대규모 언어 모델을 의미
  • 대량의 텍스트 데이터에서 학습하여 자연어 이해(NLU, Natural Language Understanding)와 자연어 생성(NLG, Natural Language Generation) 능력을 발휘함
  • 문맥을 이해하고, 질문에 답변하며, 문서를 요약하고, 새로운 텍스트를 생성하는 등 다양한 자연어 처리 작업에 사용됨

2. LLM의 등장

  • 2020년 OpenAI의 GPT-3 발표로 LLM이 세계 무대에 전면적으로 등장함
  • 2022년 하반기 GPT-3.5, 2023년 상반기 GPT-4 발표로 LLM 및 생성 AI에 대한 관심이 급증함
  • OpenAI의 GPT 시리즈, Google의 Bard와 Gemini 등이 대표적임

3. LLM의 발전

  • LLM은 인공 지능과 기계 학습, 특히 딥러닝 기술을 기반으로 개발됨
  • LLM의 핵심 가치는 방대한 정보를 처리하고 이해할 수 있는 능력에 있음
  • 챗봇, 번역, 콘텐츠 추천, 작문 등 다양한 분야에서 활용됨.
  • 특정 분야의 지식을 학습하여 전문가 수준의 답변을 제공할 수도 있음 (RAG)

LangChain 소개

1. LangChain이란

  • LLM을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 수 있는 프레임워크
  • 챗봇, 질의응답(QA), 요약 등 다양한 용도로 활용

2. 주요 특징

  • LLM 애플리케이연 개발에 필요한 다양한 구성 요소를 "연결(chain)"하는데 중점
  • 다양한 LLM 모델, 프롬프트 템플릿, Retriever 등을 제공
  • 사용자는 다양한 요소를 "연결(chain)"하는 방식으로 편리하게 시스템 개발 및 구현 가능

LangChian, 주요 LLM 라이브러리 설치

  • langchain : LLM 애플리케이션 개발 프레임워크
  • langchain-openai : LangChain 프레임워크 내에서 OpenAI의 모델을 손쉽게 사용할 수 있도록 하는 확장 패키지
  • openai : OpenAI API를 통해 접근하고 사용할 수 있도록 해주는 공식 Python 클라이언트
  • google-generativeai : 구글이 제공하는 생성 AI 모델을 지원하는 파이썬 클라이언트
  • cohere : 자연어 이해 및 생성을 위한 AI 모델을 제공하는 Cohere 플랫폼의 파이썬 클라이언드

필요한 라이브러리를 먼저 설치한다. 랭체인은 프로젝트 변경이 자주 일어나는 편이다. 버전에 따라 구문이 자주 달라지기 때문에, 개발 단계에서도 버전을 고정해서 사용하는 것이 좋을 것 같다.

!pip install -q langchain==0.1.6 langchain-openai==0.0.5 langchain_google_genai==0.0.6 openai==1.12.0 google-generativeai==0.3.2 cohere==4.47

OpenAI 인증키 설정

 

Product

Our API platform offers our latest models and guides for safety best practices.

openai.com

API를 사용하려면 인증키를 발급한다. 유료이기 때문에 결제 정보 등록이 필요하다. 

import os

os.environ['OPENAI_API_KEY'] = 'OPENAI_API_KEY'

LLM Chain

  • 프롬프트 템플릿에 있는 정보만을 사용하여 응답(가장 기본적인 형태)
  • 사용자로부터의 입력(질문)을 받고, 미리 정의된 프롬프트 템플릿에 기반해 LLM이 응답을 생성

OpenAI의 기본 모델인 GPT-3.5를 지정하고, "2022 카타르 월드컵 우승 국가는?" 라는 질문을 해본다. 아직 카타르 월드컵이 열리지 않았다는 답변을 하고 있다. 최신 정보가 학습되지 않았다는 사실을 알 수 있다. 

# GPT 3.5
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model_name='gpt-3.5-turbo-0125')

질문:

llm.invoke("Who won the Qatar World Cup in 2022?")

답변:

AIMessage(content='As of now, the Qatar World Cup in 2022 has not taken place yet. The tournament is scheduled to be held from November 21 to December 18, 2022.')

 

이번에는 GPT-4를 사용해서 같은 질문을 해본다. 답변을 보면 2021년 10월까지 학습한 정보를 기반으로 대답하고 있다. 2022년 정보까지는 학습이 되지 않은 것으로 보인다. (이처럼 최신 정보를 답변하지 못하는 약점이 있다. 이런 문제 해결을 위해 검색 API를 사용해서 최신 정보를 질문과 함께 제공하고 답변을 얻는 RAG 기법이 활용된다.)

# GPT 4
llm2 = ChatOpenAI(model_name='gpt-4')

질문:

llm2.invoke("Who won the Qatar World Cup in 2022?")

답변:

AIMessage(content='As of my knowledge up to October 2021, the Qatar World Cup in 2022 has not yet taken place. Therefore, the winner is not known.')

 

랭체인의 체인을 구성하는 간단한 예제를 만들어본다. 프롬프트 템플릿을 만들고 input 필드를 통해서 사용자의 입력을 받도록 한다. 

# 프롬프트 템플릿
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are an expert in renewable energy."),
    ("user", "{input}")
])

print(prompt)
input_variables=['input'] messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], template='You are an expert in renewable energy.')), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], template='{input}'))]

 

앞에서 정의한 프롬프트와 llm 모델을 랭체인의 LCEL 문법을 활용하여 체인으로 연결한다. 사용자의 입력(input)이 프롬프트 템플릿으로 전달된다. input 필드에 사용자의 입력이 들어가서 프롬프트 텍스트가 완성된다. 프롬프트의 출력이 그 다음 순서의 체인 요소인 llm 모델의 입력으로 전달되고, 모델은 사용자의 입력에 대한 답변을 최종 출력한다. 

 

# Chain 구성

chain = prompt | llm

chain.invoke({"input": "What are the most promising renewable energy sources for the future?"})

출력:

AIMessage(content="There are several renewable energy sources that show great promise for the future, including:\n\n1. Solar power: Solar energy is abundant, clean, and can be harnessed using photovoltaic cells or concentrated solar power systems. With advancements in technology and decreasing costs, solar power is becoming increasingly competitive with traditional fossil fuels.\n\n2. Wind power: Wind energy is another abundant and clean resource that can be harnessed to generate electricity. Wind turbines are becoming more efficient and cost-effective, making wind power a viable option for meeting energy needs.\n\n3. Hydropower: Hydropower, or energy generated from flowing water, is one of the oldest and most widely used renewable energy sources. With the potential for both large-scale hydroelectric dams and small-scale run-of-river projects, hydropower continues to be a reliable source of clean energy.\n\n4. Geothermal energy: Geothermal energy harnesses heat from the Earth's core to generate electricity or provide heating and cooling. This renewable energy source is reliable and available 24/7, making it a promising option for the future.\n\n5. Biomass: Biomass energy is derived from organic materials such as wood, agricultural residues, and waste. Biomass can be converted into biofuels, biogas, or used directly for heating and electricity generation, providing a versatile and sustainable energy source.\n\n6. Tidal and wave energy: Tidal and wave energy capture the power of ocean currents and waves to generate electricity. While still in the early stages of development, these technologies have the potential to provide a consistent and predictable source of renewable energy.\n\nOverall, a combination of these renewable energy sources, along with advancements in energy storage technologies and grid integration, will play a crucial role in transitioning to a more sustainable and decarbonized energy system in the future.")

 

 

Google Gemini

 

Build with the Gemini API  |  Google AI for Developers

Integrate the Gemini API, quickly develop prompts, and transform ideas into code to build AI apps.

ai.google.dev

구글의 생성 AI인 Gemini를 사용해서 같은 작업을 처리해본다. 

os.environ["GOOGLE_API_KEY"] = "GOOGLE_API_KEY"

모델 정의:

from langchain_google_genai.chat_models import ChatGoogleGenerativeAI

gemini = ChatGoogleGenerativeAI(
    model="gemini-pro",
    temperature=0.5,
    convert_system_message_to_human=True,
    )

질문:

gemini.invoke("Who won the Qatar World Cup in 2022?")

답변: (Gemini의 출력에는 최신 정보가 반영되는 것으로 보인다. 2022년 카타르 월드컵의 우승국가를 아르헨티나라고 정확하게 답변하고 있다.)

 

AIMessage(content='Argentina')

 

체인 구성:

gemini_chain = prompt | gemini

gemini_chain.invoke({"input": "What are the most promising renewable energy sources for the future?"})

최종 출력:

AIMessage(content="1. **Solar Energy:** \n - Solar photovoltaic (PV) systems convert sunlight directly into electricity. \n - Solar thermal systems use sunlight to heat water or air for various applications. \n - The cost of solar panels has been decreasing, making solar energy more affordable. \n\n\n2. **Wind Energy:** \n - Wind turbines harness the kinetic energy of the wind to generate electricity. \n - Offshore wind farms have the potential to provide large amounts of clean energy. \n - Floating wind turbines can access stronger winds and reduce visual impact. \n\n\n3. **Hydropower:** \n - Hydropower plants use the energy of flowing water to generate electricity. \n - Pumped-storage hydropower systems can store energy for later use. \n - Small-scale hydropower systems can be implemented in remote areas. \n\n\n4. **Geothermal Energy:** \n - Geothermal power plants use heat from the Earth's interior to generate electricity. \n - Geothermal energy can also be used for heating and cooling buildings. \n - Enhanced geothermal systems can access deeper and hotter resources. \n\n\n5. **Biomass Energy:** \n - Biomass power plants burn organic materials, such as wood, agricultural waste, or municipal solid waste, to generate electricity. \n - Biomass energy can also be used for heating and cooking. \n - Advanced biomass conversion technologies, such as gasification and pyrolysis, can improve efficiency and reduce emissions. \n\n\n6. **Ocean Energy:** \n - Ocean energy technologies harness the energy of waves, tides, and ocean currents to generate electricity. \n - Wave energy converters can capture the energy of surface waves. \n - Tidal turbines can extract energy from the movement of tides. \n - Ocean thermal energy conversion (OTEC) systems utilize the temperature difference between warm surface waters and cold deep waters to generate electricity. \n\n\n7. **Hydrogen Energy:** \n - Hydrogen fuel cells can generate electricity through a chemical reaction between hydrogen and oxygen. \n - Hydrogen can be produced from renewable energy sources, such as solar and wind, through electrolysis. \n - Hydrogen can be stored and transported, making it a versatile energy carrier.")

 

지난 번 포스팅에서는 부품을 선정한 이유(?)에 대해서 이야기했는데, 오늘은 실제로 조립하는 과정을 설명하려고 한다. 

 

[이전 게시글] 딥러닝 PC 조립 도전기 (1) : 링크 

 

딥러닝 PC 조립 도전기 (1)

1년 전에 딥러닝 PC를 조립하면서, 멀티 GPU 환경을 구성한다면서 GPU를 2개 설치했었다. PC 케이스에 내부 공간이 꽉 찰 만큼 공간도 부족했고, 무엇보다도 CPU가 멀티 GPU 환경을 받쳐줄 만큼 충분한

pydata.tistory.com

 

가장 먼저, 메인보드를 케이스에서 꺼낸다. 부속이 정확하게 들어 있는지 파손된 부분은 없는지 확인한다. 

wifi 안테나, SSD 저장장치 연결 케이블, 나사 등이 들어 있다. 

 

 AMD CPU와 기본 내장 쿨러를 상자에서 꺼낸다. AMD에서 기본 제공하는 쿨러는 꽤나 막강해 보인다. 일단 사용해 보고, 냉각 성능이 부족하다고 판단되면 교체할 생각이다. 그림 왼쪽 부분에 작은 네모 모양의 금속 부품이 CPU이다. RYZEN 이라고 문양이 새겨져 있다. 상자에서 꺼내서 메인보드에 먼저 설치한다. 

 

그림에서 빨간색 원으로 표시한 CPU의 세모 모양 홈과 메인보드의 CPU 슬롯에 표시된 부분과 일치시킨다. 이때 설명서를 잘 보고 위치를 잘 맞춰야 한다. 방향이 잘못되는 경우 CPU 파손 가능성이 있기 때문이다. 

 

3700X CPU를 홈 표시에 맞춰서 메인보드에 올려 놓으면 다음 그림과 같다. 다음으로 할 일은 CPU 우측 상단에 보이는 레버를 아래로 당겨서 홈에 고정하는 것이다. 

 

금속 레버를 쭉 당겨서 홈에 고정하면 다음과 같은 모양이 된다. 이제 CPU 설치가 완료된 것이다. 

 

CPU 쿨러를 설치할 때는 쿨러 옆면의 금속 핀의 네모난 구멍(홈)의 위치를 잘 봐야 한다. 저 홈을 위에 있는 그림의 CPU 좌우에 있는 검은 플라스틱 부품의 가운데 튀어나온 부분에 넣어서 결합시켜야 하기 때문이다. 

다음 그림과 같이 금속 부품에 뚫려 있는 부분에 검은 플라스틱 부품의 튀어 나온 부분을 끼워 넣는다. 

그리고, 반대 편도 마찬가지로 홈에 맞춰서 끼워 넣고 고정 레버를 당겨서 쿨러가 메인보드에 잘 결합되도록 한다. 

CPU 쿨러에 연결되어 있는 케이블를 메인보드의 CPU FAN 소켓에 연결해 준다. CPU 쿨러에 전원을 공급하고 제어할 수 있다. 

RAM을 메인보드에 설치할 순서이다. PC 케이스에 메인보드들 결합하거나 그래픽 카드를 설치하기 전에 RAM을 조립하는 것이 좋다. 그래픽 카드를 설치하면 공간이 협소해지기 때문에 RAM을 설치하는 작업이 번거롭게 된다. 

메인보드에 딸려 있는 설명서를 잘 읽어보고, RAM을 설치하는 슬롯 순서를 확인한다. MSI 게이밍 엣지 wifi 보드의 경우 2번 슬롯에 가장 먼저 설치하라는 내용이 있어서 그대로 따라서 설치했다. RAM을 메인보드에 끼울 때는 RAM 중간에 있는 홈과 메인보드의 홈 위치를 잘 맞추고, 깔딱 소리가 날 때까지 수직 방향으로 눌러주면 된다. 

M.2 SSD를 설치하기 위해 메인보드의 방열판을 먼저 제거해야 한다. 

방열판을 제거하고 M2 슬롯에 SSD를 30도 각도를 유지하면서 밀어 넣는다. 

고정 나사를 조여서 고정한다. 

방열판 뒤쪽의 보호필름을 벗기면 다음과 같이 된다. SSD에서 나오는 열을 배출하는 역할을 한다. 

방열판을 다시 메인보드에 결합해 준다. 

메인보드를 케이스에 맞춰서 끼우고 고정 나사를 조여준다. 

케이스 뒷면의 메인보드 단자 위치를 잘 맞추고, 메인보드에 고정하는 것이 중요하다. 

케이스 하단에 전원공급장치를 설치한다. 열을 방출하는 팬의 방향을 확인한다. 나사를 사용하여 고정한다.  

케이스 옆면의 SSD 설치 장소를 확인한다. SSD 설치 보조 판넬을 고정하고 있는 나사를 풀어서 해체한다. 

SSD를 보면 4군데 나사를 사용하여 조립할 수 있다. SSD 설치 보조판의 4개 구멍과 SSD 홀의 위치를 맞춰서 조립한다. 

SSD 설치 보조판을 다시 케이스의 원래 위치에 나사를 사용해서 고정해 준다. 

전원공급장치의 케이블을 메인보드와 주요 부품에 연결해 주어야 한다. 가장 먼저, CPU 전원 공급 케이블을 메인보드의 소켓 위치를 찾아서 연결한다. 

메인보드 메인 전원 케이블을 연결한다. 

케이스 전원 버튼과 LED 등을 제어하는 케이블을 결합한다. 케이스에 부착되어 있는 케이블을 메인보드의 해당 소켓을 찾아서 꽂아준다. 

SSD 전원 케이블과 SATA 데이터 케이블을 SSD에 연결한다. SSD 전원 케이블의 다른 쪽은 전원공급장치에 연결되야 한다. SATA 케이블의 다른 쪽은 메인보드의 SATA 소켓에 연결한다. 

RTX 2070 super 그래픽카드를 메인 PCI 슬롯에 끼운다. 이때 케이스의 금속 패널 부품이 그래픽 카드와 충돌하는데 2개 패널 부품을 제거해야 한다. 나사로 케이스에 고정해 준다. 

그래픽 카드까지 설치가 완료된 상태이다. (그림을 한 장 더 찍었어야 하는데 실수로 찍지 못했다. 아래 그림은 그래픽 카드 전원을 연결하기 전이다. 전원공급장치의 케이블을 GPU에 연결해야 한다.)

그래픽 카드 전원까지 연결하고 나면, Wifi 안테나를 케이스 뒷면의 단자에 끼워 주고 전원 케이블을 220V 콘센트에 꽂는다. 모니터를 그래픽 카드의 단자에 연결하고 전원 스위치를 눌러주면 컴퓨터가 작동된다. 다음 그림과 같이 CPU, GPU, 케이스 냉각팬 등이 작동하는지 확인한다. (메인보드 CPU 오른쪽에 LED 경고등이 있는데 빨간색 램프가 들어온 위치를 보면 어떤 부분이 오작동하는지 확인할 수 있다.) 

다음 그림과 같이 BIOS 설정 화면이 나오면 설치가 잘 된 것으로 볼 수 있다. 설정 화면에서 CPU 등 부품을 잘 인식하고 있는지 확인한다. 

'IT 리뷰' 카테고리의 다른 글

딥러닝 PC 조립 도전기 (1)  (0) 2020.12.18

1년 전에 딥러닝 PC를 조립하면서, 멀티 GPU 환경을 구성한다면서 GPU를 2개 설치했었다. PC 케이스에 내부 공간이 꽉 찰 만큼 공간도 부족했고, 무엇보다도 CPU가 멀티 GPU 환경을 받쳐줄 만큼 충분한 성능을 내지 못했다. 결국, 1년 동안 GPU 하나는 거의 사용하지 않고 방치해 두는 상황이 벌어졌다. 

 

MSI RTX-2070 super 그래픽카드

 

남는 GPU를 중고마켓에 팔아버릴까 생각도 들었는데, LOL을 즐기는 아들에게 기존 컴을 양보하고 새로 PC를 조립하기로 결정했다. GPU는 MSI RTX 2070 super가 있었기 때문에, 나머지 부품을 주문했다. 스펙을 먼저 정하고, 가격이 저렴한 인터넷 쇼핑몰을 검색해서 주문했다.  

 

구분 제조사/사양 가격 구입처
CPU AMD 라이젠 7 3700X 마티스 341,140원 위메프
메인보드 MSI MPG X570 게이밍 엣지 Wift 219,950원 위메프
RAM 삼성 DDR4 32GB PC4-25600 3200Mhz 179,000원 네이버
저장장치 (윈도우 설치용) 리뷰안 NX1200 NVMe M.2 SSD 512GB 84,580원 위메프
저장장치 (리눅스 설치용) 웨스턴디지털 WD Blue 3D SSD 500GB 69,610원 위메프
전원공급장치 시소닉 FOCUS GOLD GM-750 Modular 120,250원 쿠팡
케이스  앱코 NCORE 씨마스터 강화유리 39,900원 위메프
합계 1,014,530원 GPU 불포함

 

PC 조립 부품

 

1. CPU

이번에는 AMD 라데온 CPU를 사용해 보기로 하고, 최근에 새로 출시된 5XXX 계열의 제품을 찾아봤는데 가격이 너무 비싸서 한 세대 이전 제품 중에서 8코더 16쓰레드를 지원하면서도 30만원대에 구매 가능한 3700X로 결정했다. 딥러닝 학습에서 GPU 만큼 중요한 것이 CPU 성능이다. 코드 중간 중간에 CPU 성능을 요구하기도 하고, CPU 성능이 부족하면 GPU 성능을 100% 활용할 수 없기 때문이다. 

AMD 3700X 마티스

 

 

2. 메인보드

메인보드는 AMD CPU를 지원하는 그래픽 카드 제조사와 같은 회사 제품으로 결정했다. 덩치가 상당히 큰 2070 super 그래픽 카드를 여유있게 설치할 수 있도록 ATX 사이즈를 선택했다.  또 한가지 고려했던 조건은 메인보드에 Wifi 기능이 지원되는지 여부였다. 랜 케이블을 연결할 수도 있지만, 세컨드 PC였기 때문에 집안에서도 이동을 자주 할 필요가 있었다. 그리고, 외부에서 열리는 해커톤이나 경진대회에 가져가서 사용할 수 있지 않을까 싶은 생각도 영향을 주었다. 

MSI X570 게이밍 엣지 wifi

 

3. RAM

딥러닝 PC를 고려할 때, 가장 중요한 하드웨어는 GPU, CPU, 그리고 RAM이라고 생각한다. RAM은 여유 있을수록 좋지만, 예산의 압박 때문에 32GB만 우선 구입해서 설치했다. 예산에 여유가 생기면, 같은 스펙의 RAM을 3개 더 구매해서 128GB까지 갖출 계획이다. 메인보드도 128GB 지원이 가능한 제품이다. 

삼성 DDR4 PC4-25600 32GB RAM

 

4. SSD 저장장치

SSD 500GB 크기로 2개를 주문했다. 2개를 주문한 이유는 각각 윈도우 10과 리눅스(우분투 16.04)를 설치하고 듀얼부팅을 구현할 생각이다. 예전에는 윈도우 환경에서 GPU를 사용해서 딥러닝을 하는 것이 불편했는데, 최근에는 텐서플로 등을 사용하는데 크게 문제가 되지 않는 것 같다. 메인 OS로 윈도우 10을 사용할 생각이라서, M.2 SSD에 윈도우를 설치하려고 한다. 

리뷰안 NX1200 M.2 SSD 512GB
WD SSD 500GB

 

 

5. 전원 공급 장치

CPU와 GPU가 사용하는 소비전력량을 고려해서 여유있게 파워 용량을 잡아주는 것이 좋다. 추후 그래픽 카드를 추가한다거나 쿨러/팬 등을 추가할 때도 추가 전력이 필요하다. 시소닉 제품 중에서 GOLD 등급인 750W 제품을 선정했다.

시소닉 FOCUS GOLD 750W

 

[다음 게시글] 딥러닝 PC 조립 도전기 (2) : 링크

 

딥러닝 PC 조립 도전기 (2)

지난 번 포스팅에서는 부품을 선정한 이유(?)에 대해서 이야기했는데, 오늘은 실제로 조립하는 과정을 설명하려고 한다. [이전 게시글] 딥러닝 PC 조립 도전기 (1) : 링크 딥러닝 PC 조립 도전기 (1)

pydata.tistory.com

'IT 리뷰' 카테고리의 다른 글

딥러닝 PC 조립 도전기 (2)  (1) 2020.12.18

데이터 분포가 직선 형태인 선형관계일 때 사이킷런의 선형회귀 모형인 LinearRegression 클래스는 매우 정확한 예측력을 갖습니다. (이전 포스팅 참조)

 

만약에, 데이터 분포가 복잡하여 이런 선형관계를 인식하지 못한 상태에서도 머신러닝 또는 딥러닝 학습을 통해 선형관계라는 것을 찾아낼 수 있을까요?  

우리가 머신러닝 또는 딥러닝 알고리즘을 데이터 분석에 기반한 예측에 활용하는 이유가 여기에 있습니다. 데이터 갯수가 많거나 분포가 복잡할 수록 인간의 인지능력으로 어떤 패턴을 인식하는 것은 어렵습니다. 하지만, 머신러닝 또는 딥러닝 알고리즘을 잘 활용하면, 복잡하거나 잘 드러나지 않는 패턴을 찾을 수가 있습니다. 

앞의 예제에서 사용한 데이터셋을 가지고, 딥러닝 알고리즘을 적용해보겠습니다. 

텐서플로우(케라스) 불러오기

 

구글 코랩은 텐서플로우(tensorflow) 2.0을 지원하기 때문에, 따로 설치하지 않아도 사용할 수 있습니다. 케라스(kears)도 통합되어 지원됩니다. 다음과 같이 케라스 모듈을 불러옵니다.

>>> from tensorflow import keras
>>> from tensorflow.keras.layers import Dense

 

딥러닝 모델 객체 정의하기

 

Sequential 클래스 함수를 사용하여 신경망 객체를 생성합니다. 여러 층의 레이어를 순차적으로 연결하는 형태의 심층신경망(DNN)을 구성할 때 사용합니다. 완전연결층 Dense 레이어를 add 명령을 사용하여 추가합니다. units=1 인자는 목표변수(타겟 레이블)의 출력 데이터가 1가지 종류라는 뜻입니다. 회귀 문제는 하나의 단일 값을 예측하기 때문에 1로 지정합니다. input_shape=(1,) 옵션은 입력 데이터인 설명변수(x 변수)의 데이터 구조를 지정합니다. 여기서는 1개의 열, 즉 입력 변수인 x가 1개라는 뜻입니다.

 

compile 명령을 사용하여, 옵티마이저 함수와 로스 함수를 정의합니다. 로스 함수는 예측값의 오차를 측정하는 기준이 되고, 옵티마이저 함수는 오차를 줄이는데 사용하는 최적화 알고리즘입니다. 자세한 설명은 나중에 다루기로 하고 일단 넘어가겠습니다.

 

최종적으로, 1개의 레이어를 갖는 간단한 신경망 모델이 완성되었습니다.

>>> dnn = keras.Sequential()
>>> dnn.add(Dense(units=1, input_shape=(1,)))
>>> dnn.compile(optimizer='sgd', loss='mse')

 

summary 명령을 사용하여 인공신경망의 구조를 출력해서 확인할 수 있습니다. 입력 변수인 x 변수가 1개이므로, x 변수의 계수와 상수항(일차함수식의 y=ax + b를 생각하자)까지 2개의 파라미터가 있습니다.

>>> dnn.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)   Output Shape    Param #
=================================================================
dense (Dense)   (None, 1)        2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

 

주어진 데이터로 모델 학습시키기

 

학습을 위한 설명변수 데이터(x_new)와 목표값인 타겟 레이블 데이터(y)를 신경망 모델에 주입하고 학습을 진행합니다. fit 메소드를 사용하는 점은 앞에서 다룬 사이킷런 모델과 같습니다.

 

학습 과정을 통해서 목표값과 예측값의 오차가 가장 작은 함수 관계식을 찾습니다. 2개의 파라미터 값을 조금씩 변화를 주면서 최적화된 해를 찾는 것입니다. epochs=10은 이와 같은 학습 과정을 10번 반복한다는 뜻입니다. 로스(loss)값이 점점 줄어드는 것을 볼 수 있습니다. 학습이 잘 되고 있다는 뜻입니다.

 

>>> dnn.fit(x_new, y, epochs=10)

Epoch 1/10
1/1 [==============================] - 0s 2ms/step - loss: 122.3979
Epoch 2/10
1/1 [==============================] - 0s 878us/step - loss: 14.1135
Epoch 3/10
1/1 [==============================] - 0s 2ms/step - loss: 2.3010
Epoch 4/10
1/1 [==============================] - 0s 1ms/step - loss: 0.9857
Epoch 5/10
1/1 [==============================] - 0s 1ms/step - loss: 0.8137
Epoch 6/10
1/1 [==============================] - 0s 1ms/step - loss: 0.7672
Epoch 7/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7355
Epoch 8/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7064
Epoch 9/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6787
Epoch 10/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6520
<tensorflow.python.keras.callbacks.History at 0x7f237c5d90b8>

 

새로운 x 데이터에 대한 y값 예측하기

 

x_test 변수에 저장되어 있는 데이터를 모델에 주입합니다. predict 메소드를 사용합니다. x 변수 값을 입력받아서 y값을 예측하게 됩니다. 예측값을 변수 y_hat_dnn에 저장합니다. 결과값은 21, 23, 25, 27, 29이고, 앞에서 다룬 사이킷런 LinearRegression 모델의 예측결과와 일치합니다.

 

>>> y_hat_dnn = dnn.predict(x_test)
>>> y_hat_dnn

array([21., 23., 25., 27., 29.])

이전 포스팅(https://pydata.tistory.com/29)에 정리한 x_new 데이터와 y 데이터를 가지고, 머신러닝 알고리즘에게 학습을 시키는 과정을 보겠습니다. 일차함수 관계식을 가지고 만들었기 때문에, (x_new, y) 좌표에 점을 찍으면 직선 형태로 나타납니다. 이와 같이 두 변수 사이의 관계가 직선 형태를 갖는 경우 선형 관계에 있다고 말합니다.

 

 

필요한 라이브러리 불러오기

 

통계학에서는 선형회귀분석이라고 부르는데, 사이킷런(sklearn) 라이브러리는 선형회귀분석을 포함한 다양한 통계 툴을 지원합니다. LinearRegression 클래스 함수는 통계학의 선형회귀분석을 처리합니다.

>>> from sklearn.linear_model import LinearRegression

 

 

머신러닝 모델 객체 정의하기

 

LinearRegression 클래스 객체를 생성하고, 변수 lr에 저장합니다. LinearRegression 클래스 함수의 인수에 다양한 파라미터를 설정할 수 있습니다. 예를 들어, LinearRegression(fit_intercept=False, n_jobs=-1) 이라고 정의하면, 일차함수 식의 y절편인 b값을 계산하지 않습니다. n_jobs는 모델학습에 사용할 CPU 개수를 지정할 때 사용하는데, -1은 모든 CPU를 할당하여 사용한다는 뜻입니다. 2개의 CPU가 있는 컴퓨터에서 1개의 CPU만 사용하고 싶을 때는, n_jobs=1이라고 지정할 수 있습니다.

>>> lr = LinearRegression()

 

주어진 데이터로 모델 학습시키기

 

머신러닝 모델 객체를 만든 뒤에, 학습 데이터 x_new와 목표 값(정답) y를 모델에 주입하고 학습을 시킵니다. 이때 fit 메소드를 사용하는데, 실행을 하면 예측값의 오차가 가장 작은 함수 관계식을 찾게 됩니다. 기울기(a)는 2, y절편(b)는 -1로 거의 정확하게 관계식을 찾는데 성공했습니다.

>>> lr.fit(x_new, y)
>>> print ("기울기: ", lr.coef_)
>>> print ("y절편: ", lr.intercept_)

기울기: [2.]
y절편: -0.9999999999999996

 

새로운 x 데이터에 대한 y값 예측하기

 

전 단계에서 훈련을 마친 선형회귀 모델을 이용하여 새로운 데이터에 대한 목표값을 예측하겠습니다. 예측을 위한 새로운 데이터셋을 준비하고 x_test 변수에 저장합니다. 11~15 범위의 정수를 모델의 x 변수 입력 형태에 맞게 입력합니다.

>>> x_test = np.arange(11, 16, 1).reshape(-1, 1)
>>> x_test

array([[11],
[12],
[13],
[14],
[15]])

 

모델을 가지고 예측하는데 predict 메소드를 사용합니다. x 변수 값을 입력받아서 y값을 예측하게 됩니다. 예측값을 변수 y_hat에 저장합니다. 결과값은 21, 23, 25, 27, 29입니다.

>>> y_hat = lr.predict(x_test)
>>> y_hat

array([21., 23., 25., 27., 29.])

+ Recent posts