Giới thiệu Deeplearning4j

Hiện nay có nhiều nền tảng hỗ trợ triển khai các mô hình máy học, và chúng được viết bằng nhiều ngôn ngữ lập trình khác nhau. Chẳng hạn như Python cung cấp nhiều thư viện như Keras, Gluon; C#/F# là ngôn ngữ được viết trong nền tảng máy học ML .NET; Java/Kotlin, Scala, Clojure là các ngôn ngữ được viết trong nền tảng máy học Deeplearning4j.

Thậm chí chúng ta có thể kết hợp nhiều ngôn ngữ lập trình khác nhau để xây dựng ra các mô hình máy học linh động, đáp ứng hầu hết các nhu cầu của người dùng.

Tương tự như các nền tảng máy học được viết bằng Python, hay các nền tảng máy học được viết bằng C#/F# thì Deeplearning4j cũng là một thư viện mã nguồn mở, nó hỗ trợ hầu hết các hướng tiếp cận của các mô hình máy học, chẳng hạn như:

DL4J(Deeplearning4j) cũng hỗ trợ nhiều loại giải thuật khác nhau trong Machine Learning, bao gồm (Tui chưa liệt kê hết):

  • Support Vector Machines
  • Linear regression
  • Logistic regression
  • Naïve Bayes
  • Linear discriminant analysis
  • Decision trees
  • Neural Networks (Multilayer perceptron)

Chi tiết về DL4J người đọc có thể xem thêm tại link https://deeplearning4j.konduit.ai/

Source code đầy đủ ứng dụng của DL4J: https://github.com/deeplearning4j

Và các bài của Enrique Llerena Dominguez https://ienjoysoftware.dev/

Về cơ bản, ứng dụng máy học thường có 3 bước làm việc chính, đó là bước PREPARING (data and platform), TRAINING và bước PREDICTION. Và nó là giống nhau không lệ thuộc vào chúng ta chọn nền tảng hay ngôn ngữ nào, Tui cũng đã viết trong bài này các bạn có thể đọc lại.

Tui minh họa lại các bước sử dụng DeepLearning4J cho 3 bước xử lý với một chương trình máy học như dưới đây:

Bước Preparing gồm 3 bước:

  • (1) Problem description: Mô tả vấn đề mà ta muốn xử lý bằng các mô hình máy học. Tùy vào vấn đề mà ta muốn giải quyết để lựa chọn các dữ liệu phù hợp
  • (2) Dataset description: Mô tả về dữ liệu để giải quyết vấn đề mà ta muốn. Bước Problem description và Dataset description có thể hoán đổi cho nhau. Đôi khi ta có dữ liệu trước rồi mới chợt nghĩ ra các vấn đề liên quan tới dữ liệu. Hoặc ta có vấn đề trước rồi mới nghĩ cách tìm ra các dữ liệu phù hợp cho vấn đề.
  • (3) Sau đó ta tạo dự án và tích hợp DeepLearning4j vào, chi tiết Integrated DeepLearning4j sẽ được trình bày ở bài sau.

Bước Training gồm có 7 bước:

  • (1) Load Dataset: Nạp dữ liệu để chuẩn bị cho train mô hình
  • (2) Data Normalization: cần phải được chuẩn hóa thì mô hình mới hiểu, tùy vào từng mô hình máy học mà kỹ thuật chuẩn hóa sẽ khác nhau, nên khi nào vào bài toán cụ thể thì ta sẽ lựa chọn kỹ thuật chuẩn hóa phù hợp.
  • (3) Train and test selection: Dữ liệu cần được tách thành các phần train và set với các tỉ lệ phù hợp, việc lựa chọn tỉ lệ cũng đóng vai trò quan trong cho chất lượng của mô hình
  • (4) Model configuration: Mỗi mô hình trước khi train cần được cài đặt các thông số, việc cài đặt này quyết định tới chất lượng mô hình, do đó cần có kinh nghiệm
  • (5) Train model: bắt đầu train mô hình
  • (6) Evaluate model: mô hình train xong cần phải được đánh giá chất lượng xem có tốt hay không, có nhiều thang đo khác nhau để đo lường chất lượng của mô hình. Tùy từng bài toán mà ta lựa chọn các thang đo phù hợp. Nếu mô hình đạt chất lượng không tốt thì có thể quay lại bước Preparing để làm lại dữ liệu, hay quay lại bước train and test selection để lựa chọn lại tỉ lệ cũng như cấu hình lại các thông số để train mô hình. Lưu ý trong máy học không có mô hình đúng hay mô hình sai, mà chỉ có mô hình phù hợp hay không.
  • (7) Export model: Sau khi mô hình được đánh giá chất lượng thì nó cần được lưu xuống ổ cứng để phục vụ cho việc tái sử dụng và các công đoạn prediction. Lưu ý cần lưu luôn cả chuẩn hóa của mô hình để phục vụ cho quá trình chuẩn hóa dữ liệu đầu vào phục vụ prediction

Bước Prediction gồm có 5 bước:

  • (1) Load model: Dự án sẽ tải mô hình được lưu ở bước Training, bao gồm tải luôn chuẩn hóa
  • (2) Format Input Data: Dữ liệu muốn được prediction thì cần được format cho đúng đầu vào, vì mỗi loại thư viện có các lớp đặc tả khác nhau, nó cần được đưa về đúng format. DL4J cũng vậy, nó dùng INDArray làm dữ liệu đầu vào, thì rõ ràng các dữ liệu thô của chúng ta muốn prediction phải đưa về INDArray
  • (3) Input Data Normalization: Dữ liệu phải được chuẩn hóa để phù hợp khi đưa vào mô hình, nó phái giống với chuẩn hóa của mô hình lúc train.
  • (4) Feed Input Data: Bắt đầu đưa dữ liệu được chuẩn vào vào mô hình để prediction
  • (5) Prediction Results: Là kết quả prediction sau khi chạy mô hình với kết quả đầu vào ta đã chuẩn hóa.

Như vậy ở trên Tui đã vẽ lại mô hình tổng quan, cũng như liệt kê sơ lược các bước chính trong quá trình xử lý mô hình máy học.

Đối với Deeplearning4j để sử dụng được ta cần chuẩn bị:

  • Bước 1: Cài đặt JDK 19
  • Bước 2: cài công cụ lập trình: IntelliJ IDEA Community Edition (hoặc Eclipse), Tui đề nghị dùng IntelliJ IDEA Community Edition vì nó tối ưu hơn. Và các bài viết tiếp theo Tui cũng dùng IntelliJ IDEA Community Edition
  • Bước 3: Trong IDEA Community tạo dự án dạng Maven, và cấu hình file pom.xml như dưới đây:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"
                                               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.deeplearning4j</groupId>
    <artifactId>dl4j-examples</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>Introduction to DL4J</name>
    <description>A set of examples introducing the DL4J framework</description>

    <properties>
        <dl4j-master.version>1.0.0-M2.1</dl4j-master.version>
        <!-- Change the nd4j.backend property to nd4j-cuda-X-platform to use CUDA GPUs -->
        <!-- <nd4j.backend>nd4j-cuda-10.2-platform</nd4j.backend> -->
        <ND4J-Version>1.0.0-M1.1</ND4J-Version>
        <nd4j.backend>nd4j-native-platform</nd4j.backend>
        <java.version>19</java.version>
        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
        <maven.minimum.version>3.3.1</maven.minimum.version>
        <exec-maven-plugin.version>1.4.0</exec-maven-plugin.version>
        <maven-shade-plugin.version>2.4.3</maven-shade-plugin.version>
        <jcommon.version>1.0.23</jcommon.version>
        <jfreechart.version>1.0.13</jfreechart.version>
        <logback.version>1.1.7</logback.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.0-M1</junit.version>
        <javacv.version>1.5.5</javacv.version>
        <spark.version>2.4.8</spark.version>
    </properties>


    <repositories>
        <repository>
            <id>sonatype-nexus-snapshots</id>
            <name>Sonatype Nexus Snapshots</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>  <!-- Optional, update daily -->
            </snapshots>
        </repository>



    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>${nd4j.backend}</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>


        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-api</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-data-image</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-local</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-datasets</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>

        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>resources</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>

        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-ui</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-zoo</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <!-- ParallelWrapper & ParallelInference live here -->
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-parallel-wrapper</artifactId>
            <version>${dl4j-master.version}</version>
        </dependency>
        <!-- Used in the feedforward/classification/MLP* and feedforward/regression/RegressionMathFunctions example -->
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>${jfreechart.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jcommon</artifactId>
            <version>${jcommon.version}</version>
        </dependency>
        <!-- Used for downloading data in some of the examples -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.5</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>${javacv.version}</version>
        </dependency>

        <!-- Test dependency. Ignore for your own application. -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>



    </dependencies>
    <!-- Maven Enforcer: Ensures user has an up to date version of Maven before building -->
    <build>
        <plugins>

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <inherited>true</inherited>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit-platform</artifactId>
                        <version>3.0.0-M5</version>
                    </dependency>
                </dependencies>
            </plugin>

            <plugin>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.0.1</version>
                <executions>
                    <execution>
                        <id>enforce-default</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <version>[${maven.minimum.version},)</version>
                                    <message>********** Minimum Maven Version is ${maven.minimum.version}. Please upgrade Maven before continuing (run "mvn --version" to check). **********</message>
                                </requireMavenVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.lewisd</groupId>
                <artifactId>lint-maven-plugin</artifactId>
                <version>0.0.11</version>
                <configuration>
                    <failOnViolation>true</failOnViolation>
                    <onlyRunRules>
                        <rule>DuplicateDep</rule>
                        <rule>RedundantPluginVersion</rule>
                        <!-- Rules incompatible with Java 9
                        <rule>VersionProp</rule>
                        <rule>DotVersionProperty</rule> -->
                    </onlyRunRules>
                </configuration>
                <executions>
                    <execution>
                        <id>pom-lint</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>${exec-maven-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${maven-shade-plugin.version}</version>
                <configuration>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>${shadedClassifier}</shadedClassifierName>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>org/datanucleus/**</exclude>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>com.lewisd</groupId>
                                        <artifactId>lint-maven-plugin</artifactId>
                                        <versionRange>[0.0.11,)</versionRange>
                                        <goals>
                                            <goal>check</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore/>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Như vậy Tui đã giới thiệu sơ lược về DeepLearning4j, các bước xử lý cho bài toán liên quan tới máy học. Cũng như các công cụ phần mềm cần phải cài đặt trước, các bạn nhớ chuẩn bị đủ.

Các bài học sau Tui sẽ minh họa chi tiết cách dùng DeepLearning4j vào bài toán phân loại, sử dụng đúng quy trình ở trên mà Tui đã thiết kế

Chúc các bạn thành công