1. 소개
로지스틱 회귀는 기계 학습(ML) 실무자 도구 상자에서 중요한 도구입니다.
이 예제에서 우리는 로지스틱 회귀의 이면에 있는 주요 아이디어를 탐구할 것 입니다.
먼저 ML 패러다임과 알고리즘에 대한 간략한 개요부터 시작하겠습니다.
2. 개요
ML을 사용하면 인간 친화적인 용어로 공식화할 수 있는 문제를 해결할 수 있습니다. 그러나 이 사실은 우리 소프트웨어 개발자에게 도전이 될 수 있습니다. 우리는 컴퓨터 친화적인 용어로 공식화할 수 있는 문제를 해결하는 데 익숙해졌습니다. 예를 들어, 인간은 사진에서 물체를 쉽게 감지하거나 문구의 분위기를 설정할 수 있습니다. 컴퓨터에 대해 그러한 문제를 어떻게 공식화할 수 있습니까?
해결책 을 찾기 위해 ML에는 training 이라는 특별한 단계가 있습니다. 이 단계에서 입력 데이터를 알고리즘에 공급하여 최적의 매개변수 세트(소위 가중치)를 도출하도록 시도합니다. 알고리즘에 더 많은 입력 데이터를 제공할수록 더 정확한 예측을 기대할 수 있습니다.
교육은 반복적인 ML 워크플로의 일부입니다.
데이터 수집부터 시작합니다. 종종 데이터는 다른 소스에서 제공됩니다. 따라서 동일한 형식으로 만들어야 합니다. 데이터 세트가 연구 영역을 공정하게 나타내도록 제어해야 합니다. 모델이 빨간 사과에 대해 훈련된 적이 없다면 거의 예측할 수 없습니다.
다음으로 데이터를 사용하고 예측할 수 있는 모델을 구축해야 합니다. ML에는 모든 상황에서 잘 작동하는 미리 정의된 모델이 없습니다.
올바른 모델을 검색할 때 모델을 만들고, 훈련하고, 예측을 보고, 예측이 만족스럽지 않기 때문에 모델을 버리는 일이 쉽게 발생할 수 있습니다. 이 경우 한 발 물러서서 다른 모델을 만들고 프로세스를 다시 반복해야 합니다.
3. ML 패러다임
ML에서는 어떤 종류의 입력 데이터를 마음대로 사용할 수 있는지에 따라 세 가지 주요 패러다임을 선택할 수 있습니다.
- Map 학습(이미지 분류, 사물 인식, 감정 분석)
- 비Map 학습(이상 탐지)
- 강화 학습(게임 전략)
이 예제에서 설명할 경우는 Map 학습에 속합니다.
4. ML 도구 상자
ML에는 모델을 구축할 때 적용할 수 있는 도구 세트가 있습니다. 그 중 몇 가지를 언급해 보겠습니다.
- 선형 회귀
- 로지스틱 회귀
- 신경망
- 서포트 벡터 머신
- k-최근접이웃
예측 가능성이 높은 모델을 구축할 때 여러 도구를 결합할 수 있습니다. 사실, 이 예제에서 우리 모델은 로지스틱 회귀와 신경망을 사용할 것입니다.
5. ML 라이브러리
Java가 ML 모델을 프로토타이핑하는 데 가장 널리 사용되는 언어는 아니지만 ML을 비롯한 여러 영역에서 강력한 소프트웨어를 만들기 위한 신뢰할 수 있는 도구로 명성이 있습니다. 따라서 Java로 작성된 ML 라이브러리를 찾을 수 있습니다.
이러한 맥락에서 우리는 자바 버전도 있는 사실상의 표준 라이브러리인 Tensorflow 를 언급할 수 있습니다. 언급할 가치가 있는 또 다른 것은 Deeplearning4j 라는 딥 러닝 라이브러리 입니다. 이것은 매우 강력한 도구이며 이 예제에서도 사용할 것입니다.
6. 숫자 인식에 대한 로지스틱 회귀
로지스틱 회귀의 주요 아이디어는 입력 데이터의 레이블을 가능한 한 정확하게 예측하는 모델을 구축하는 것입니다.
소위 손실 함수 또는 목적 함수가 최소값에 도달할 때까지 모델을 훈련합니다. 손실 함수는 실제 모델 예측과 예상 예측(입력 데이터의 레이블)에 따라 다릅니다. 우리의 목표는 실제 모델 예측과 예상 예측의 차이를 최소화하는 것입니다.
그 최소값에 만족하지 않으면 다른 모델을 구축하고 훈련을 다시 수행해야 합니다.
로지스틱 회귀가 작동하는지 확인하기 위해 필기 숫자 인식에 대해 설명합니다. 이 문제는 이미 고전적인 문제가 되었습니다. Deeplearning4j 라이브러리에는 API 사용 방법을 보여주는 일련의 실제 예제 가 있습니다. 이 예제의 코드 관련 부분은 MNIST Classifier를 기반으로 합니다.
6.1. 입력 데이터
입력 데이터로 잘 알려진 MNIST 손글씨 숫자 데이터베이스 를 사용합니다 . 입력 데이터로 28×28 픽셀 그레이 스케일 이미지가 있습니다. 각 이미지에는 이미지가 나타내는 숫자인 자연스러운 레이블이 있습니다.
구축할 모델의 효율성을 추정하기 위해 입력 데이터를 학습 및 테스트 세트로 분할합니다.
DataSetIterator train = new RecordReaderDataSetIterator(...);
DataSetIterator test = new RecordReaderDataSetIterator(...);
입력 이미지에 레이블을 지정하고 두 세트로 분할하면 "데이터 정교화" 단계가 끝나고 "모델 구축"으로 넘어갈 수 있습니다.
6.2. 모델 빌딩
언급했듯이 모든 상황에서 잘 작동하는 모델은 없습니다. 그럼에도 불구하고, ML에 대한 수년간의 연구 끝에 과학자들은 손으로 쓴 숫자를 인식하는 데 매우 효과적인 모델을 발견했습니다. 여기서는 소위 LeNet-5 모델을 사용합니다.
LeNet-5는 28×28 픽셀 이미지를 10차원 벡터로 변환하는 일련의 레이어로 구성된 신경망입니다.
10차원 출력 벡터에는 입력 이미지의 레이블이 0, 1, 2 등일 확률이 포함됩니다.
예를 들어, 출력 벡터의 형식이 다음과 같은 경우:
{0.1, 0.0, 0.3, 0.2, 0.1, 0.1, 0.0, 0.1, 0.1, 0.0}
입력 이미지가 0일 확률은 0.1, 1일 경우 0, 2일 경우 0.3 등을 의미합니다. 최대 확률(0.3)은 레이블 3에 해당함을 알 수 있습니다.
모델 구축에 대해 자세히 알아보겠습니다. Java 관련 세부 정보는 생략하고 ML 개념에 집중합니다.
MultiLayerNetwork 객체 를 생성하여 모델을 설정 합니다.
MultiLayerNetwork model = new MultiLayerNetwork(config);
생성자에서 MultiLayerConfiguration 객체를 전달해야 합니다. 이것은 신경망의 기하학을 설명하는 바로 그 객체입니다. 네트워크 지오메트리를 정의하려면 모든 레이어를 정의해야 합니다.
첫 번째와 두 번째 방법으로 이 작업을 수행하는 방법을 보여 드리겠습니다.
ConvolutionLayer layer1 = new ConvolutionLayer
.Builder(5, 5).nIn(channels)
.stride(1, 1)
.nOut(20)
.activation(Activation.IDENTITY)
.build();
SubsamplingLayer layer2 = new SubsamplingLayer
.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(2, 2)
.stride(2, 2)
.build();
계층의 정의에는 전체 네트워크 성능에 상당한 영향을 미치는 상당한 양의 임시 매개변수가 포함되어 있습니다. 바로 이 지점에서 모든 사람의 환경에서 좋은 모델을 찾는 능력이 중요해집니다.
이제 MultiLayerConfiguration 객체 를 구성할 준비가 되었습니다 .
MultiLayerConfiguration config = new NeuralNetConfiguration.Builder()
// preparation steps
.list()
.layer(layer1)
.layer(layer2)
// other layers and final steps
.build();
MultiLayerNetwork 생성자에 전달합니다 .
6.3. 훈련
우리가 구성한 모델에는 431080개의 매개변수 또는 가중치가 포함되어 있습니다. 여기에서 이 숫자의 정확한 계산을 제공하지는 않겠지만 첫 번째 레이어의 가중치가 24x24x20 = 11520보다 크다는 점을 알아야 합니다 .
훈련 단계는 다음과 같이 간단합니다.
model.fit(train);
처음에는 431080 매개변수에 랜덤의 값이 있지만 훈련 후에는 모델 성능을 결정하는 일부 값을 얻습니다. 모델의 예측성을 평가할 수 있습니다.
Evaluation eval = model.evaluate(test);
logger.info(eval.stats());
LeNet-5 모델은 단일 훈련 반복(epoch)에서도 거의 99%의 매우 높은 정확도를 달성합니다. 더 높은 정확도를 달성하려면 일반 for 루프를 사용하여 더 많은 반복을 수행해야 합니다 .
for (int i = 0; i < epochs; i++) {
model.fit(train);
train.reset();
test.reset();
}
6.4. 예측
이제 모델을 훈련하고 테스트 데이터에 대한 예측에 만족하므로 완전히 새로운 입력에 대해 모델을 시도할 수 있습니다. 이를 위해 파일 시스템에서 선택한 파일에서 이미지를 로드하는 MnistPrediction 새 클래스를 만들어 보겠습니다 .
INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file);
new ImagePreProcessingScaler(0, 1).transform(image);
가변 이미지 에는 28×28 그레이스케일로 축소된 사진이 포함되어 있습니다. 우리는 그것을 우리의 모델에 공급할 수 있습니다:
INDArray output = model.output(image);
변수 출력 에는 이미지가 0, 1, 2 등일 확률이 포함됩니다.
이제 조금 플레이하고 숫자 2를 쓰고 이 이미지를 디지털화하고 모델에 공급해 보겠습니다. 다음과 같은 결과를 얻을 수 있습니다.
보시다시피 최대 값이 0.99인 구성 요소에는 인덱스 2가 있습니다. 이는 모델이 손으로 쓴 숫자를 올바르게 인식했음을 의미합니다.
7. 결론
이 사용방법(예제)에서는 기계 학습의 일반적인 개념을 설명했습니다. 필기 숫자 인식에 적용한 로지스틱 회귀 예제에서 이러한 개념을 설명했습니다.
항상 그렇듯이 GitHub 리포지토리 에서 해당 코드 조각을 찾을 수 있습니다 .